# Run in console prior to running chunks:
getwd()
setwd('/Users/reginaduval/Grad_Work/MSDS692_Practicum1/Project/Data')
dist <- read.csv("County_data_distance.csv", header = TRUE, stringsAsFactors = FALSE)
train <- read.csv("train2.csv", header = TRUE, stringsAsFactors = FALSE)
pop <- read.csv("covid_county_population_usafacts.csv")
total_cases <- read.csv("total_cases.csv", header = TRUE)
total_deaths <- read.csv("total_deaths.csv", header = TRUE)
dist2 <- read.csv("Select_county_data_distance.csv", header = TRUE)
MN_9cum <- read.csv("MN_9_0613.csv", header = TRUE, stringsAsFactors = FALSE)
MN_9dcum <- read.csv("MN_9d_0613.csv", header = TRUE, stringsAsFactors = FALSE)
MN_0613 <- read.csv("covid_cases_0613.csv", header = TRUE, stringsAsFactors = FALSE)
county_data <- read.csv("County_data_distance2.csv", header = TRUE, stringsAsFactors = FALSE)
MN_0613d <- read.csv("covid_deaths_0613.csv", header = TRUE, stringsAsFactors = FALSE)
US_7cum <- read.csv("covid_cases_0613 copy.csv", header = TRUE, stringsAsFactors = FALSE)
US_7dcum <- read.csv("covid_deaths_0613 copy.csv", header = TRUE, stringsAsFactors = FALSE)
cases0612 <- read.csv("covid_confirmed_usafacts.csv", header = TRUE, stringsAsFactors = FALSE)
deaths0612 <- read.csv("covid_deaths_usafacts.csv", header = TRUE, stringsAsFactors = FALSE)
I. Data collection and clean up A. Pull initial data from Kaggle competition B. Investigate additional data points like population, distance, and meat-packing plants at county level C. Combine data and put into correct format for EDA and time series analysis
library(astsa)
library(broom)
library(caret)
library(DAAG)
library(dplyr)
library(dynlm)
library(forecast)
library(fpp2)
library(funModeling)
library(knitr)
library(MARSS)
library(matrixStats)
library(MTS)
library(quantmod)
library(readxl)
library(tidyverse)
library(sf)
library(tidycensus)
library(tmap)
library(tmaptools)
library(tseries)
library(urbnmapr)
library(urca)
library(varhandle)
library(vars)
# # Review files from Kaggle competition
# train <- read.csv("train.csv", header = TRUE, stringsAsFactors = FALSE)
# # break out cases and deaths
# train_cases <- train %>% filter(Target == "ConfirmedCases")
# train_cases$Cases <- train_cases$TargetValue
# train_deaths <- train %>% filter(Target == "Fatalities")
# train_deaths$Deaths <- train_deaths$TargetValue
# # merge back to one dataset
# train2 <- merge(train_cases[, c(2, 3, 4, 5, 7, 10)], train_deaths[, c(2, 3, 4, 5, 7, 10)])
# # convert date column to date format (for EDA)
# train2$Date <- as.Date(train2$Date)
# # save train2
# write.csv(train2, "train2.csv", row.names = FALSE)
# # Create new file with extra variables (pop, dist, meat) by FIPS
# class(data)
# head(data)
# head(data2)
# tail(data3)
# data3$concatenate <- paste0(data3$county1, data3$county2)
# tail(data3)
# head(data4)
# data4 <- data4[, 1:6]
# head(data4)
# data4$concatenate <- data4$concatenate_BD
# head(data4)
# data4 <- data4[, -6]
# head(data4)
# dim(data4)
# data_full <- merge(data3[, c("concatenate", "mi_to_county")], data4, by.y, all.y = all)
# tail(data_full)
# summary(data_full)
# str(data_full)
# data_full$state <- as.character(data_full$state)
# data_full <- data_full %>% arrange(state)
# head(data_full)
# final_data <- data_full[, c(3, 4, 5, 6, 7, 2)]
# head(final_data)
# is.na(final_data)
# # write.csv(final_data, "County_data_distance.csv", row.names = FALSE)
# add pop to "County_data_distance.csv" from train2 dataset
# combine county data with train2 dataset
head(dist)
dim(dist)
[1] 3143 10
train_US <- train %>% filter(Country_Region == "US") %>% filter(County != "")
train_US$concatenate <- paste(train_US$County, train_US$Province_State, sep = "")
head(train_US)
dim(train_US)
[1] 339444 8
train_US <- train_US[, c(4, 8)]
dist2 <- left_join(dist, train_US, by = "concatenate")
dim(dist2)
[1] 337411 11
head(dist2)
dist2 <- unique(dist2)
dim(dist2)
[1] 3143 11
head(dist2)
# write.csv(dist2, "Distance Data/County_data_distance2.csv", row.names = FALSE)
- Exploratory Data Analysis A. Basic EDA on county data B. Select specific counties to analyze more closely C. Add geographic data to map full US data and MN data


# COVID maps of US counties
tm_shape(spatial_data, projections = 2163) +
tm_polygons(col = "total_cases", style = "quantile", palette = "OrRd") +
tm_layout(title = "Total COVID cases by County",
title.size = 1.1,
title.position = c("center", "top"))
# COVID maps of US counties
tm_shape(spatial_data, projections = 2163) +
tm_polygons(col = "total_cases", style = "quantile", palette = "OrRd") +
tm_layout(title = "Total COVID cases by County",
title.size = 1.1,
title.position = c("center", "top"))
tm_shape(spatial_data, projections = 2163) +
tm_polygons(col = "total_deaths", style = "log10_pretty", palette = "OrRd") +
tm_layout(title = "Total COVID deaths by County",
title.size = 1.1,
title.position = c("center", "top"))

# Distance maps of MN counties
MNmap <- tm_shape(spatial_data_MN, projection = 2163) +
tm_polygons(col = "mi_to_county", style = "quantile", palette = "-YlGnBu") +
tm_legend(position = c("right", "center")) +
tm_layout(title = "Minnesota Counties,\nDist to Twin Cities",
title.size = 1.1,
title.position = c("center", "top"))
# Distance maps of MN counties
MNmap <- tm_shape(spatial_data_MN, projection = 2163) +
tm_polygons(col = "mi_to_county", style = "quantile", palette = "-YlGnBu") +
tm_legend(position = c("right", "center")) +
tm_layout(title = "Minnesota Counties,\nDist to Twin Cities",
title.size = 1.1,
title.position = c("center", "top"))
MNmap

MNmap + tm_shape(plants, projection = 2163) +
tm_polygons(col = "meat_plant", palette = "Oranges")

# COVID maps of MN counties
MNmapCOVID <- tm_shape(spatial_data_MN, projection = 2163) +
tm_polygons(c("total_cases", "total_deaths"), style = c("quantile", "pretty"),
palette = list("YlGnBu", "YlOrRd")) +
tm_legend(position = c("right", "center")) +
tm_layout(title = " MN Counties, COVID Data",
title.size = 1.1,
title.position = c("center", "top"))
MNmapCOVID

- Country level time series analysis A. Filter data to 6 key countries (US, China, UK, Turkey, Brazil, India) B. Work through various time series models for US C. Choose best ts model (ARIMA) and tune D. Replicate models for other countries E. Forecast 10 days out
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_casesBrazil <- auto.arima(casesBrazil, stepwise = FALSE, approximation = FALSE)
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_casesBrazil <- auto.arima(casesBrazil, stepwise = FALSE, approximation = FALSE)
fit_casesBrazil # ARIMA(3, 1, 2), AICc - 1680.4
Series: casesBrazil
ARIMA(3,1,2) with drift
Coefficients:
ar1 ar2 ar3 ma1 ma2 drift
0.2055 -0.1651 -0.6007 -0.5297 0.7085 96.2554
s.e. 0.1299 0.1944 0.0877 0.1086 0.2421 42.2660
sigma^2 estimated as 350911: log likelihood=-832.63
AIC=1679.27 AICc=1680.4 BIC=1697.98
autoplot(fit_casesBrazil)

autoplot(fit_casesBrazil)

sarima.for(casesBrazil_train, n.ahead = 20, 3, 1, 2)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 6761.806 6826.082 6559.373 6232.534 6106.810 6311.566 6738.719 7131.645 7264.507 7098.194 6801.384
[12] 6627.818 6738.400 7092.859 7483.668 7684.478 7607.057 7358.058 7159.432 7191.605
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 383.3465 474.2080 562.6096 615.5042 654.6923 690.1179 732.5245 785.1342 842.0206 892.4678
[11] 930.7273 959.1391 984.2810 1012.8340 1048.6828 1089.9041 1129.6206 1162.0464 1186.8793 1208.0817
lines(casesBrazil_test)

checkresiduals(fit_casesBrazil)
Ljung-Box test
data: Residuals from ARIMA(3,1,2) with drift
Q* = 26.985, df = 16, p-value = 0.04165
Model df: 6. Total lags used: 22

fit_casesBrazil2 <- arima(casesBrazil, order = c(4, 2, 4))
checkresiduals(fit_casesBrazil2) # passes the Ljung Box test
Ljung-Box test
data: Residuals from ARIMA(4,2,4)
Q* = 23.256, df = 14, p-value = 0.05622
Model df: 8. Total lags used: 22

fit_deathsBrazil <- auto.arima(deathsBrazil, stepwise = FALSE, approximation = FALSE)
checkresiduals(fit_casesBrazil2) # passes the Ljung Box test
Ljung-Box test
data: Residuals from ARIMA(4,2,4)
Q* = 23.256, df = 14, p-value = 0.05622
Model df: 8. Total lags used: 22

fit_deathsBrazil <- auto.arima(deathsBrazil, stepwise = FALSE, approximation = FALSE)
fit_deathsBrazil # ARIMA(4, 1, 0), AICc - 1155.41
Series: deathsBrazil
ARIMA(4,1,0) with drift
Coefficients:
ar1 ar2 ar3 ar4 drift
-0.2215 -0.0897 -0.1323 -0.4454 6.1765
s.e. 0.0914 0.1006 0.0985 0.0990 2.6035
sigma^2 estimated as 2642: log likelihood=-571.28
AIC=1154.57 AICc=1155.41 BIC=1170.6
autoplot(fit_deathsBrazil)

autoplot(fit_deathsBrazil)

sarima.for(deathsBrazil_train, n.ahead = 20, 4, 1, 0)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 419.2291 347.3918 346.8175 394.1833 422.7578 436.1088 415.1895 399.8110 403.4813 419.4030 436.2125
[12] 440.1693 436.3332 433.4382 437.1307 446.1233 454.1783 458.2167 459.2964 460.8374
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 36.11087 44.27688 48.59298 49.47584 49.86034 52.18818 55.79384 59.64367 61.98798 63.32910 64.67596
[12] 66.46161 68.75936 70.98974 72.80179 74.31150 75.78037 77.40465 79.14916 80.85408
lines(deathsBrazil_test)

checkresiduals(fit_deathsBrazil) # passes
Ljung-Box test
data: Residuals from ARIMA(4,1,0) with drift
Q* = 26.501, df = 17, p-value = 0.06581
Model df: 5. Total lags used: 22

checkresiduals(fit_deathsBrazil) # passes
Ljung-Box test
data: Residuals from ARIMA(4,1,0) with drift
Q* = 26.501, df = 17, p-value = 0.06581
Model df: 5. Total lags used: 22

# Use best models to forecast further ahead
fc_10_Brazil <- sarima.for(casesBrazil, n.ahead = 10, 4, 2, 4)

checkresiduals(fit_deathsBrazil) # passes
Ljung-Box test
data: Residuals from ARIMA(4,1,0) with drift
Q* = 26.501, df = 17, p-value = 0.06581
Model df: 5. Total lags used: 22

# Use best models to forecast further ahead
fc_10_Brazil <- sarima.for(casesBrazil, n.ahead = 10, 4, 2, 4)

fc_10_Brazil$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 10178.22 10091.11 11590.62 12235.86 13126.08 13321.69 13724.37 14110.56 14851.42 15607.26
fcd_10_Brazil <- sarima.for(deathsBrazil, n.ahead = 10, 4, 1, 0)

fcd_10_Brazil$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 643.2884 662.4851 594.1631 702.4151 691.7823 696.5816 724.2516 682.5469 705.0708 709.6913
checkresiduals(fit_casesBrazil2) # passes the Ljung Box test
Ljung-Box test
data: Residuals from ARIMA(4,2,4)
Q* = 23.256, df = 14, p-value = 0.05622
Model df: 8. Total lags used: 22

fit_deathsBrazil <- auto.arima(deathsBrazil, stepwise = FALSE, approximation = FALSE)
fit_deathsBrazil # ARIMA(4, 1, 0), AICc - 1155.41
Series: deathsBrazil
ARIMA(4,1,0) with drift
Coefficients:
ar1 ar2 ar3 ar4 drift
-0.2215 -0.0897 -0.1323 -0.4454 6.1765
s.e. 0.0914 0.1006 0.0985 0.0990 2.6035
sigma^2 estimated as 2642: log likelihood=-571.28
AIC=1154.57 AICc=1155.41 BIC=1170.6
autoplot(fit_deathsBrazil)

sarima.for(deathsBrazil_train, n.ahead = 20, 4, 1, 0)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 419.2291 347.3918 346.8175 394.1833 422.7578 436.1088 415.1895 399.8110 403.4813 419.4030 436.2125
[12] 440.1693 436.3332 433.4382 437.1307 446.1233 454.1783 458.2167 459.2964 460.8374
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 36.11087 44.27688 48.59298 49.47584 49.86034 52.18818 55.79384 59.64367 61.98798 63.32910 64.67596
[12] 66.46161 68.75936 70.98974 72.80179 74.31150 75.78037 77.40465 79.14916 80.85408
lines(deathsBrazil_test)

checkresiduals(fit_deathsBrazil) # passes
Ljung-Box test
data: Residuals from ARIMA(4,1,0) with drift
Q* = 26.501, df = 17, p-value = 0.06581
Model df: 5. Total lags used: 22

# Use best models to forecast further ahead
fc_10_Brazil <- sarima.for(casesBrazil, n.ahead = 10, 4, 2, 4)

fc_10_Brazil$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 10178.22 10091.11 11590.62 12235.86 13126.08 13321.69 13724.37 14110.56 14851.42 15607.26
fcd_10_Brazil <- sarima.for(deathsBrazil, n.ahead = 10, 4, 1, 0)

fcd_10_Brazil$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 643.2884 662.4851 594.1631 702.4151 691.7823 696.5816 724.2516 682.5469 705.0708 709.6913
# Repeat for China
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS, DIFFERENCED DATA SETS
casesChina <- tsChina[, "Cases"]
casesChina_train <- casesChina %>% window(end = c(2020, 120))
casesChina_train <- casesChina %>% window(end = c(2020, 120))
casesChina_test <- casesChina %>% window(end = c(2020, 130))
diff_casesChina <- diff(casesChina)
deathsChina <- tsChina[, "Deaths"]
deathsChina_train <- deathsChina %>% window(end = c(2020, 120))
deathsChina_test <- deathsChina %>% window(end = c(2020, 130))
diff_deathsChina <- diff(deathsChina)
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_casesChina <- auto.arima(casesChina, stepwise = FALSE, approximation = FALSE)
fit_casesChina # ARIMA(0, 1, 1), AICc - 1874.66
Series: casesChina
ARIMA(0,1,1)
Coefficients:
ma1
-0.7238
s.e. 0.0734
sigma^2 estimated as 2295057: log likelihood=-935.27
AIC=1874.54 AICc=1874.66 BIC=1879.89
fit_casesChina # ARIMA(0, 1, 1), AICc - 1874.66
Series: casesChina
ARIMA(0,1,1)
Coefficients:
ma1
-0.7238
s.e. 0.0734
sigma^2 estimated as 2295057: log likelihood=-935.27
AIC=1874.54 AICc=1874.66 BIC=1879.89
autoplot(fit_casesChina)

autoplot(fit_casesChina)

sarima.for(casesChina_train, n.ahead = 20, 0, 1, 1)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] -14.44721 -22.21844 -29.98968 -37.76091 -45.53214 -53.30338 -61.07461 -68.84585 -76.61708
[10] -84.38831 -92.15955 -99.93078 -107.70202 -115.47325 -123.24449 -131.01572 -138.78695 -146.55819
[19] -154.32942 -162.10066
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 1583.415 1642.436 1699.409 1754.533 1807.976 1859.885 1910.384 1959.582 2007.574 2054.446 2100.272
[12] 2145.119 2189.048 2232.112 2274.361 2315.839 2356.588 2396.644 2436.041 2474.811
lines(casesChina_test)

checkresiduals(fit_casesChina) # passes Ljung Box test
Ljung-Box test
data: Residuals from ARIMA(0,1,1)
Q* = 10.617, df = 21, p-value = 0.9697
Model df: 1. Total lags used: 22

fit_deathsChina <- auto.arima(deathsChina, stepwise = FALSE, approximation = FALSE)
fit_deathsChina # ARIMA(0, 0, 0) WHITE NOISE,AICc - 1361.29
Series: deathsChina
ARIMA(0,0,0) with non-zero mean
Coefficients:
mean
42.7778
s.e. 12.4686
sigma^2 estimated as 16947: log likelihood=-678.59
AIC=1361.18 AICc=1361.29 BIC=1366.54
# Repeat for India
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS, DIFFERENCED DATA SETS
casesIndia <- tsIndia[, "Cases"]
casesIndia_train <- casesIndia %>% window(end = c(2020, 120))
# Repeat for India
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS, DIFFERENCED DATA SETS
casesIndia <- tsIndia[, "Cases"]
casesIndia_train <- casesIndia %>% window(end = c(2020, 120))
casesIndia_test <- casesIndia %>% window(end = c(2020, 130))
diff_casesIndia <- diff(casesIndia)
diff_casesIndia <- diff(casesIndia)
deathsIndia <- tsIndia[, "Deaths"]
deathsIndia <- tsIndia[, "Deaths"]
deathsIndia_train <- deathsIndia %>% window(end = c(2020, 120))
deathsIndia_train <- deathsIndia %>% window(end = c(2020, 120))
deathsIndia_test <- deathsIndia %>% window(end = c(2020, 130))
diff_deathsIndia <- diff(deathsIndia)
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_casesIndia <- auto.arima(casesIndia, stepwise = FALSE, approximation = FALSE)
fit_casesIndia # ARIMA(0, 1, 2), AICc - 1470.79
Series: casesIndia
ARIMA(0,1,2) with drift
Coefficients:
ma1 ma2 drift
-0.6010 0.2519 29.7706
s.e. 0.0972 0.0920 14.1403
sigma^2 estimated as 51751: log likelihood=-731.2
AIC=1470.4 AICc=1470.79 BIC=1481.09
autoplot(fit_casesIndia)

sarima.for(casesIndia_train, n.ahead = 20, 0, 1, 2)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 1688.654 1840.992 1859.485 1877.977 1896.470 1914.963 1933.456 1951.949 1970.441 1988.934 2007.427
[12] 2025.920 2044.413 2062.905 2081.398 2099.891 2118.384 2136.877 2155.369 2173.862
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 155.6078 173.5986 181.8841 189.8083 197.4147 204.7387 211.8096 218.6520 225.2866 231.7314 238.0017
[12] 244.1110 250.0711 255.8924 261.5842 267.1547 272.6115 277.9611 283.2098 288.3629
lines(casesIndia_test)

checkresiduals(fit_casesIndia) # passes the Ljung Box test
Ljung-Box test
data: Residuals from ARIMA(0,1,2) with drift
Q* = 23.363, df = 19, p-value = 0.2217
Model df: 3. Total lags used: 22

fit_deathsIndia <- auto.arima(deathsIndia, stepwise = FALSE, approximation = FALSE)
fit_deathsIndia <- auto.arima(deathsIndia, stepwise = FALSE, approximation = FALSE)
fit_deathsIndia # ARIMA(4, 1, 0), AICc - 848.95
Series: deathsIndia
ARIMA(4,1,0) with drift
Coefficients:
ar1 ar2 ar3 ar4 drift
-0.7113 -0.4206 -0.2434 -0.2459 1.0281
s.e. 0.0940 0.1145 0.1139 0.0955 0.4478
sigma^2 estimated as 151: log likelihood=-418.06
AIC=848.11 AICc=848.95 BIC=864.15
fit_deathsIndia # ARIMA(4, 1, 0), AICc - 848.95
Series: deathsIndia
ARIMA(4,1,0) with drift
Coefficients:
ar1 ar2 ar3 ar4 drift
-0.7113 -0.4206 -0.2434 -0.2459 1.0281
s.e. 0.0940 0.1145 0.1139 0.0955 0.4478
sigma^2 estimated as 151: log likelihood=-418.06
AIC=848.11 AICc=848.95 BIC=864.15
autoplot(fit_deathsIndia)

autoplot(fit_deathsIndia)

sarima.for(deathsIndia_train, n.ahead = 20, 4, 1, 0)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 62.68084 67.86632 66.96706 67.84111 70.50516 68.72801 70.70753 71.23923 71.34247 72.92316 72.91385
[12] 73.83024 74.66868 75.02204 76.01576 76.54349 77.21679 78.01620 78.57044 79.33989
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 6.254629 6.371803 6.690971 7.295919 7.393912 8.038123 8.313837 8.559386 8.974898 9.180993
[11] 9.505059 9.788530 10.020246 10.315512 10.548093 10.797000 11.048356 11.271317 11.511939 11.735595
lines(deathsIndia_test)
lines(deathsIndia_test)

checkresiduals(fit_deathsIndia) # passes
Ljung-Box test
data: Residuals from ARIMA(4,1,0) with drift
Q* = 9.9658, df = 17, p-value = 0.905
Model df: 5. Total lags used: 22

checkresiduals(fit_deathsIndia) # passes
Ljung-Box test
data: Residuals from ARIMA(4,1,0) with drift
Q* = 9.9658, df = 17, p-value = 0.905
Model df: 5. Total lags used: 22

# Use best models to forecast further ahead
fc_10_India <- sarima.for(casesIndia, n.ahead = 10, 0, 1, 2)

# Use best models to forecast further ahead
fc_10_India <- sarima.for(casesIndia, n.ahead = 10, 0, 1, 2)

fc_10_India$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 3296.262 3246.772 3276.542 3306.313 3336.083 3365.854 3395.624 3425.395 3455.166 3484.936
fcd_10_India <- sarima.for(deathsIndia, n.ahead = 10, 4, 1, 0)

fcd_10_India$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 113.5211 108.5624 112.9270 110.2884 114.8406 115.5648 115.3987 117.4482 117.4596 119.1467
# Repeat for Turkey
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS, DIFFERENCED DATA SETS
casesTurkey <- tsTurkey[, "Cases"]
casesTurkey_train <- casesTurkey %>% window(end = c(2020, 120))
# Repeat for Turkey
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS, DIFFERENCED DATA SETS
casesTurkey <- tsTurkey[, "Cases"]
casesTurkey_train <- casesTurkey %>% window(end = c(2020, 120))
casesTurkey_test <- casesTurkey %>% window(end = c(2020, 130))
diff_casesTurkey <- diff(casesTurkey)
diff_casesTurkey <- diff(casesTurkey)
deathsTurkey <- tsTurkey[, "Deaths"]
deathsTurkey <- tsTurkey[, "Deaths"]
deathsTurkey_train <- deathsTurkey %>% window(end = c(2020, 120))
fcd_10_India$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 113.5211 108.5624 112.9270 110.2884 114.8406 115.5648 115.3987 117.4482 117.4596 119.1467
# Repeat for Turkey
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS, DIFFERENCED DATA SETS
casesTurkey <- tsTurkey[, "Cases"]
casesTurkey_train <- casesTurkey %>% window(end = c(2020, 120))
casesTurkey_test <- casesTurkey %>% window(end = c(2020, 130))
diff_casesTurkey <- diff(casesTurkey)
deathsTurkey <- tsTurkey[, "Deaths"]
deathsTurkey_train <- deathsTurkey %>% window(end = c(2020, 120))
deathsTurkey_test <- deathsTurkey %>% window(end = c(2020, 130))
casesTurkey_test <- casesTurkey %>% window(end = c(2020, 130))
diff_casesTurkey <- diff(casesTurkey)
deathsTurkey <- tsTurkey[, "Deaths"]
deathsTurkey_train <- deathsTurkey %>% window(end = c(2020, 120))
deathsTurkey_test <- deathsTurkey %>% window(end = c(2020, 130))
diff_deathsTurkey <- diff(deathsTurkey)
diff_deathsTurkey <- diff(deathsTurkey)
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_casesTurkey <- auto.arima(casesTurkey, stepwise = FALSE, approximation = FALSE)
fit_casesTurkey # ARIMA(1, 1, 4), AICc - 1518.22
Series: casesTurkey
ARIMA(1,1,4)
Coefficients:
ar1 ma1 ma2 ma3 ma4
0.8292 -0.8253 -0.1877 -0.1799 0.5037
s.e. 0.0804 0.1027 0.1077 0.1282 0.0977
sigma^2 estimated as 77758: log likelihood=-752.69
AIC=1517.38 AICc=1518.22 BIC=1533.42
autoplot(fit_casesTurkey)

autoplot(fit_casesTurkey)

sarima.for(casesTurkey_train, n.ahead = 20, 1, 1, 4)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 3029.565 3008.048 2964.522 3387.826 3483.513 3527.171 3562.567 3596.650 3630.524 3664.366 3698.202
[12] 3732.038 3765.873 3799.709 3833.544 3867.380 3901.215 3935.050 3968.886 4002.721
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 279.6939 400.2613 503.6633 560.9737 677.8426 787.9286 885.9506 974.3812 1055.4610 1130.7467
[11] 1201.3243 1267.9796 1331.3018 1391.7459 1449.6720 1505.3708 1559.0810 1611.0015 1661.3001 1710.1199
lines(casesTurkey_test)

checkresiduals(fit_casesTurkey) # passes Ljung Box test
Ljung-Box test
data: Residuals from ARIMA(1,1,4)
Q* = 24.078, df = 17, p-value = 0.1173
Model df: 5. Total lags used: 22

checkresiduals(fit_casesTurkey) # passes Ljung Box test
Ljung-Box test
data: Residuals from ARIMA(1,1,4)
Q* = 24.078, df = 17, p-value = 0.1173
Model df: 5. Total lags used: 22

fit_deathsTurkey <- auto.arima(deathsTurkey, stepwise = FALSE, approximation = FALSE)
fit_deathsTurkey <- auto.arima(deathsTurkey, stepwise = FALSE, approximation = FALSE)
fit_deathsTurkey # ARIMA(1, 1, 1), AICc - 648.99
Series: deathsTurkey
ARIMA(1,1,1)
Coefficients:
ar1 ma1
0.9280 -0.7925
s.e. 0.0567 0.0843
sigma^2 estimated as 24.17: log likelihood=-321.38
AIC=648.76 AICc=648.99 BIC=656.77
fit_deathsTurkey # ARIMA(1, 1, 1), AICc - 648.99
Series: deathsTurkey
ARIMA(1,1,1)
Coefficients:
ar1 ma1
0.9280 -0.7925
s.e. 0.0567 0.0843
sigma^2 estimated as 24.17: log likelihood=-321.38
AIC=648.76 AICc=648.99 BIC=656.77
autoplot(fit_deathsTurkey)

sarima.for(deathsTurkey_train, n.ahead = 20, 1, 1, 3)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 88.75692 88.90431 89.39671 90.28286 91.17014 92.05743 92.94471 93.83200 94.71928 95.60657
[11] 96.49385 97.38114 98.26842 99.15571 100.04299 100.93028 101.81756 102.70484 103.59213 104.47941
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 4.500711 6.979740 9.259851 11.696584 13.708356 15.460534 17.033414 18.472852 19.807962 21.058595
[11] 22.239009 23.359850 24.429320 25.453894 26.438794 27.388299 28.305971 29.194812 30.057381 30.895877
lines(deathsTurkey_test)

checkresiduals(fit_deathsTurkey) # passes
Ljung-Box test
data: Residuals from ARIMA(1,1,1)
Q* = 23.582, df = 20, p-value = 0.2611
Model df: 2. Total lags used: 22

# Use best models to forecast further ahead
fc_10_Turkey <- sarima.for(casesTurkey, n.ahead = 10, 1, 1, 4)

fc_10_Turkey$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 1670.783 1717.924 1816.134 1763.657 1722.394 1690.408 1666.100 1648.142 1635.438 1627.083
fcd_10_Turkey <- sarima.for(deathsTurkey, n.ahead = 10, 1, 1, 3)

fcd_10_Turkey$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 47.58606 45.80776 44.06012 42.45847 40.99171 39.64960 38.42267 37.30217 36.28003 35.34877
# Repeat for UK
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS, DIFFERENCED DATA SETS
casesUK <- tsUK[, "Cases"]
casesUK_train <- casesUK %>% window(end = c(2020, 120))
casesUK_test <- casesUK %>% window(end = c(2020, 130))
casesUK_test <- casesUK %>% window(end = c(2020, 130))
diff_casesUK <- diff(casesUK)
deathsUK <- tsUK[, "Deaths"]
sarima.for(deathsTurkey_train, n.ahead = 20, 1, 1, 3)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 88.75692 88.90431 89.39671 90.28286 91.17014 92.05743 92.94471 93.83200 94.71928 95.60657
[11] 96.49385 97.38114 98.26842 99.15571 100.04299 100.93028 101.81756 102.70484 103.59213 104.47941
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 4.500711 6.979740 9.259851 11.696584 13.708356 15.460534 17.033414 18.472852 19.807962 21.058595
[11] 22.239009 23.359850 24.429320 25.453894 26.438794 27.388299 28.305971 29.194812 30.057381 30.895877
lines(deathsTurkey_test)

checkresiduals(fit_deathsTurkey) # passes
Ljung-Box test
data: Residuals from ARIMA(1,1,1)
Q* = 23.582, df = 20, p-value = 0.2611
Model df: 2. Total lags used: 22

# Use best models to forecast further ahead
fc_10_Turkey <- sarima.for(casesTurkey, n.ahead = 10, 1, 1, 4)

fc_10_Turkey$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 1670.783 1717.924 1816.134 1763.657 1722.394 1690.408 1666.100 1648.142 1635.438 1627.083
fcd_10_Turkey <- sarima.for(deathsTurkey, n.ahead = 10, 1, 1, 3)

fcd_10_Turkey$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 47.58606 45.80776 44.06012 42.45847 40.99171 39.64960 38.42267 37.30217 36.28003 35.34877
# Repeat for UK
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS, DIFFERENCED DATA SETS
casesUK <- tsUK[, "Cases"]
casesUK_train <- casesUK %>% window(end = c(2020, 120))
casesUK_test <- casesUK %>% window(end = c(2020, 130))
diff_casesUK <- diff(casesUK)
deathsUK <- tsUK[, "Deaths"]
deathsUK_train <- deathsUK %>% window(end = c(2020, 120))
diff_casesUK <- diff(casesUK)
deathsUK <- tsUK[, "Deaths"]
deathsUK_train <- deathsUK %>% window(end = c(2020, 120))
deathsUK_test <- deathsUK %>% window(end = c(2020, 130))
deathsUK_test <- deathsUK %>% window(end = c(2020, 130))
diff_deathsUK <- diff(deathsUK)
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_casesUK <- auto.arima(casesUK, stepwise = FALSE, approximation = FALSE)
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_casesUK <- auto.arima(casesUK, stepwise = FALSE, approximation = FALSE)
fit_casesUK # ARIMA(3, 1, 2), AICc - 1700.4
Series: casesUK
ARIMA(3,1,2) with drift
Coefficients:
ar1 ar2 ar3 ma1 ma2 drift
0.6527 -0.2495 -0.3920 -1.3253 0.7142 43.0059
s.e. 0.1770 0.1084 0.1273 0.1945 0.1163 24.2431
sigma^2 estimated as 423776: log likelihood=-842.63
AIC=1699.27 AICc=1700.4 BIC=1717.98
fit_casesUK # ARIMA(3, 1, 2), AICc - 1700.4
Series: casesUK
ARIMA(3,1,2) with drift
Coefficients:
ar1 ar2 ar3 ma1 ma2 drift
0.6527 -0.2495 -0.3920 -1.3253 0.7142 43.0059
s.e. 0.1770 0.1084 0.1273 0.1945 0.1163 24.2431
sigma^2 estimated as 423776: log likelihood=-842.63
AIC=1699.27 AICc=1700.4 BIC=1717.98
autoplot(fit_casesUK)

fit_casesUK # ARIMA(3, 1, 2), AICc - 1700.4
Series: casesUK
ARIMA(3,1,2) with drift
Coefficients:
ar1 ar2 ar3 ma1 ma2 drift
0.6527 -0.2495 -0.3920 -1.3253 0.7142 43.0059
s.e. 0.1770 0.1084 0.1273 0.1945 0.1163 24.2431
sigma^2 estimated as 423776: log likelihood=-842.63
AIC=1699.27 AICc=1700.4 BIC=1717.98
autoplot(fit_casesUK)

sarima.for(casesUK_train, n.ahead = 20, 3, 1, 2)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 4050.904 4152.183 4231.449 4326.202 4377.655 4403.729 4408.403 4419.534 4449.988 4504.446 4572.139
[12] 4638.233 4690.415 4725.934 4751.002 4776.431 4811.093 4857.667 4912.160 4967.069
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 586.0736 606.6333 662.6996 676.5956 711.1349 753.3029 818.8537 884.9817 942.5691 983.4384
[11] 1012.5957 1036.5155 1061.9516 1093.0877 1130.5595 1170.6427 1208.1820 1240.1062 1266.7283 1290.4919
lines(casesUK_test)
lines(casesUK_test)

checkresiduals(fit_casesUK) # passes the LJung Box test
Ljung-Box test
data: Residuals from ARIMA(3,1,2) with drift
Q* = 22.681, df = 16, p-value = 0.1225
Model df: 6. Total lags used: 22

checkresiduals(fit_casesUK) # passes the LJung Box test
Ljung-Box test
data: Residuals from ARIMA(3,1,2) with drift
Q* = 22.681, df = 16, p-value = 0.1225
Model df: 6. Total lags used: 22

fit_deathsUK <- auto.arima(deathsUK, stepwise = FALSE, approximation = FALSE)
fit_deathsUK # ARIMA(1, 1, 3), AICc - 1350.23
Series: deathsUK
ARIMA(1,1,3)
Coefficients:
ar1 ma1 ma2 ma3
0.5772 -1.1140 -0.1400 0.5424
s.e. 0.1186 0.1062 0.1455 0.0839
sigma^2 estimated as 16286: log likelihood=-669.82
AIC=1349.64 AICc=1350.23 BIC=1363
autoplot(fit_deathsUK)

autoplot(fit_deathsUK)

sarima.for(deathsUK_train, n.ahead = 20, 1, 1, 3)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 595.2481 585.6878 551.3371 532.9061 523.9270 520.5598 520.5246 522.4676 525.5851 529.4001 533.6291
[12] 538.1039 542.7246 547.4320 552.1909 556.9803 561.7879 566.6062 571.4309 576.2594
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 123.3315 136.4543 136.7248 142.5479 154.3391 169.6170 186.2735 203.0971 219.5073 235.2700 250.3215
[12] 264.6768 278.3825 291.4956 304.0729 316.1669 327.8245 339.0871 349.9906 360.5663

autoplot(fit_deathsUK)

sarima.for(deathsUK_train, n.ahead = 20, 1, 1, 3)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 595.2481 585.6878 551.3371 532.9061 523.9270 520.5598 520.5246 522.4676 525.5851 529.4001 533.6291
[12] 538.1039 542.7246 547.4320 552.1909 556.9803 561.7879 566.6062 571.4309 576.2594
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 123.3315 136.4543 136.7248 142.5479 154.3391 169.6170 186.2735 203.0971 219.5073 235.2700 250.3215
[12] 264.6768 278.3825 291.4956 304.0729 316.1669 327.8245 339.0871 349.9906 360.5663
lines(deathsUK_test)

checkresiduals(fit_deathsUK)
Ljung-Box test
data: Residuals from ARIMA(1,1,3)
Q* = 70.983, df = 18, p-value = 3.079e-08
Model df: 4. Total lags used: 22

checkresiduals(fit_deathsUK)
Ljung-Box test
data: Residuals from ARIMA(1,1,3)
Q* = 70.983, df = 18, p-value = 3.079e-08
Model df: 4. Total lags used: 22

fit_deathsUK2 <- arima(deathsUK, order = c(6, 2, 9))
checkresiduals(fit_deathsUK)
Ljung-Box test
data: Residuals from ARIMA(1,1,3)
Q* = 70.983, df = 18, p-value = 3.079e-08
Model df: 4. Total lags used: 22

fit_deathsUK2 <- arima(deathsUK, order = c(6, 2, 9))
checkresiduals(fit_deathsUK2) # p-value = 0.019, closest I could get to 0.05
Ljung-Box test
data: Residuals from ARIMA(6,2,9)
Q* = 16.686, df = 7, p-value = 0.01953
Model df: 15. Total lags used: 22

fit_deathsUK2 <- arima(deathsUK, order = c(6, 2, 9))
checkresiduals(fit_deathsUK2) # p-value = 0.019, closest I could get to 0.05
Ljung-Box test
data: Residuals from ARIMA(6,2,9)
Q* = 16.686, df = 7, p-value = 0.01953
Model df: 15. Total lags used: 22

# Use best models to forecast further ahead
fc_10_UK <- sarima.for(casesUK, n.ahead = 10, 3, 1, 2)

fc_10_UK$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 4248.787 4537.199 4975.123 5093.243 4990.550 4764.910 4639.472 4696.669 4896.270 5103.977
fcd_10_UK <- sarima.for(deathsUK, n.ahead = 10, 6, 2, 9)

fit_deathsTurkey <- auto.arima(deathsTurkey, stepwise = FALSE, approximation = FALSE)
fit_deathsTurkey # ARIMA(1, 1, 1), AICc - 648.99
Series: deathsTurkey
ARIMA(1,1,1)
Coefficients:
ar1 ma1
0.9280 -0.7925
s.e. 0.0567 0.0843
sigma^2 estimated as 24.17: log likelihood=-321.38
AIC=648.76 AICc=648.99 BIC=656.77
autoplot(fit_deathsTurkey)

sarima.for(deathsTurkey_train, n.ahead = 20, 1, 1, 3)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 88.75692 88.90431 89.39671 90.28286 91.17014 92.05743 92.94471 93.83200 94.71928 95.60657
[11] 96.49385 97.38114 98.26842 99.15571 100.04299 100.93028 101.81756 102.70484 103.59213 104.47941
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 4.500711 6.979740 9.259851 11.696584 13.708356 15.460534 17.033414 18.472852 19.807962 21.058595
[11] 22.239009 23.359850 24.429320 25.453894 26.438794 27.388299 28.305971 29.194812 30.057381 30.895877
lines(deathsTurkey_test)

checkresiduals(fit_deathsTurkey) # passes
Ljung-Box test
data: Residuals from ARIMA(1,1,1)
Q* = 23.582, df = 20, p-value = 0.2611
Model df: 2. Total lags used: 22

# Use best models to forecast further ahead
fc_10_Turkey <- sarima.for(casesTurkey, n.ahead = 10, 1, 1, 4)

fc_10_Turkey$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 1670.783 1717.924 1816.134 1763.657 1722.394 1690.408 1666.100 1648.142 1635.438 1627.083
fcd_10_Turkey <- sarima.for(deathsTurkey, n.ahead = 10, 1, 1, 3)

fcd_10_Turkey$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 47.58606 45.80776 44.06012 42.45847 40.99171 39.64960 38.42267 37.30217 36.28003 35.34877
# Repeat for UK
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS, DIFFERENCED DATA SETS
casesUK <- tsUK[, "Cases"]
casesUK_train <- casesUK %>% window(end = c(2020, 120))
casesUK_test <- casesUK %>% window(end = c(2020, 130))
diff_casesUK <- diff(casesUK)
deathsUK <- tsUK[, "Deaths"]
deathsUK_train <- deathsUK %>% window(end = c(2020, 120))
deathsUK_test <- deathsUK %>% window(end = c(2020, 130))
diff_deathsUK <- diff(deathsUK)
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_casesUK <- auto.arima(casesUK, stepwise = FALSE, approximation = FALSE)
fit_casesUK # ARIMA(3, 1, 2), AICc - 1700.4
Series: casesUK
ARIMA(3,1,2) with drift
Coefficients:
ar1 ar2 ar3 ma1 ma2 drift
0.6527 -0.2495 -0.3920 -1.3253 0.7142 43.0059
s.e. 0.1770 0.1084 0.1273 0.1945 0.1163 24.2431
sigma^2 estimated as 423776: log likelihood=-842.63
AIC=1699.27 AICc=1700.4 BIC=1717.98
autoplot(fit_casesUK)

sarima.for(casesUK_train, n.ahead = 20, 3, 1, 2)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 4050.904 4152.183 4231.449 4326.202 4377.655 4403.729 4408.403 4419.534 4449.988 4504.446 4572.139
[12] 4638.233 4690.415 4725.934 4751.002 4776.431 4811.093 4857.667 4912.160 4967.069
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 586.0736 606.6333 662.6996 676.5956 711.1349 753.3029 818.8537 884.9817 942.5691 983.4384
[11] 1012.5957 1036.5155 1061.9516 1093.0877 1130.5595 1170.6427 1208.1820 1240.1062 1266.7283 1290.4919
lines(casesUK_test)

checkresiduals(fit_casesUK) # passes the LJung Box test
Ljung-Box test
data: Residuals from ARIMA(3,1,2) with drift
Q* = 22.681, df = 16, p-value = 0.1225
Model df: 6. Total lags used: 22

fit_deathsUK <- auto.arima(deathsUK, stepwise = FALSE, approximation = FALSE)
fit_deathsUK # ARIMA(1, 1, 3), AICc - 1350.23
Series: deathsUK
ARIMA(1,1,3)
Coefficients:
ar1 ma1 ma2 ma3
0.5772 -1.1140 -0.1400 0.5424
s.e. 0.1186 0.1062 0.1455 0.0839
sigma^2 estimated as 16286: log likelihood=-669.82
AIC=1349.64 AICc=1350.23 BIC=1363
autoplot(fit_deathsUK)

sarima.for(deathsUK_train, n.ahead = 20, 1, 1, 3)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 595.2481 585.6878 551.3371 532.9061 523.9270 520.5598 520.5246 522.4676 525.5851 529.4001 533.6291
[12] 538.1039 542.7246 547.4320 552.1909 556.9803 561.7879 566.6062 571.4309 576.2594
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 123.3315 136.4543 136.7248 142.5479 154.3391 169.6170 186.2735 203.0971 219.5073 235.2700 250.3215
[12] 264.6768 278.3825 291.4956 304.0729 316.1669 327.8245 339.0871 349.9906 360.5663
lines(deathsUK_test)

checkresiduals(fit_deathsUK)
Ljung-Box test
data: Residuals from ARIMA(1,1,3)
Q* = 70.983, df = 18, p-value = 3.079e-08
Model df: 4. Total lags used: 22

fit_deathsUK2 <- arima(deathsUK, order = c(6, 2, 9))
checkresiduals(fit_deathsUK2) # p-value = 0.019, closest I could get to 0.05
Ljung-Box test
data: Residuals from ARIMA(6,2,9)
Q* = 16.686, df = 7, p-value = 0.01953
Model df: 15. Total lags used: 22

# Use best models to forecast further ahead
fc_10_UK <- sarima.for(casesUK, n.ahead = 10, 3, 1, 2)

fc_10_UK$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 4248.787 4537.199 4975.123 5093.243 4990.550 4764.910 4639.472 4696.669 4896.270 5103.977
fcd_10_UK <- sarima.for(deathsUK, n.ahead = 10, 6, 2, 9)

fcd_10_UK$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 237.2505 229.5029 450.6278 506.4696 410.9696 425.0414 204.9640 106.4399 127.9745 236.3315
- State level time series analysis A. Filter data to 7 key states (MN, CO, MI, NE, PA, SD, TX) B. Replicate ARIMA models for each state C. Forecast 10 days out D. Multivariate ts analysis (VAR and MARSS) for MN


autoplot(fit_casesSD)
autoplot(fit_casesSD)
sarima.for(casesSD_train, n.ahead = 20, 0, 1, 3)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 55.80984 78.14699 86.87687 87.73647 88.59606 89.45565 90.31525 91.17484 92.03444 92.89403
[11] 93.75363 94.61322 95.47281 96.33241 97.19200 98.05160 98.91119 99.77079 100.63038 101.48997
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 14.55914 19.17060 24.74320 32.90091 39.40448 44.97729 49.93196 54.43752 58.59767 62.48145 66.13754
[12] 69.60185 72.90173 76.05856 79.08950 82.00849 84.82709 87.55501 90.20046 92.77051
lines(casesSD_test)
lines(casesSD_test)

checkresiduals(fit_casesSD) # doesn't pass Ljung-Box test
Ljung-Box test
data: Residuals from ARIMA(0,1,3)
Q* = 34.763, df = 19, p-value = 0.01491
Model df: 3. Total lags used: 22
lines(casesSD_test)

checkresiduals(fit_casesSD) # doesn't pass Ljung-Box test
Ljung-Box test
data: Residuals from ARIMA(0,1,3)
Q* = 34.763, df = 19, p-value = 0.01491
Model df: 3. Total lags used: 22

fit_casesSD2 <- arima(casesSD, order = c(2, 1, 5))
checkresiduals(fit_casesSD) # doesn't pass Ljung-Box test
Ljung-Box test
data: Residuals from ARIMA(0,1,3)
Q* = 34.763, df = 19, p-value = 0.01491
Model df: 3. Total lags used: 22

fit_casesSD2 <- arima(casesSD, order = c(2, 1, 5))
checkresiduals(fit_casesSD2) # p-value = 0.018 (closest I could get to 0.05) - not a good model
Ljung-Box test
data: Residuals from ARIMA(2,1,5)
Q* = 28.669, df = 15, p-value = 0.01774
Model df: 7. Total lags used: 22

fit_deathsSD <- auto.arima(deathsSD, stepwise = FALSE, approximation = FALSE)
fit_deathsSD # ARIMA(4, 1, 0), AICc - 217.37
Series: deathsSD
ARIMA(4,1,0)
Coefficients:
ar1 ar2 ar3 ar4
-0.3889 -0.6590 -0.5299 -0.4510
s.e. 0.0930 0.0832 0.0888 0.1015
sigma^2 estimated as 0.4121: log likelihood=-103.39
AIC=216.78 AICc=217.37 BIC=230.14
fit_deathsSD # ARIMA(4, 1, 0), AICc - 217.37
Series: deathsSD
ARIMA(4,1,0)
Coefficients:
ar1 ar2 ar3 ar4
-0.3889 -0.6590 -0.5299 -0.4510
s.e. 0.0930 0.0832 0.0888 0.1015
sigma^2 estimated as 0.4121: log likelihood=-103.39
AIC=216.78 AICc=217.37 BIC=230.14
autoplot(fit_deathsSD)

autoplot(fit_deathsSD)

sarima.for(deathsSD_train, n.ahead = 20, 4, 1, 0)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 0.6879463 0.8160066 0.7666529 0.2831663 1.2283244 0.9142358 0.7809673 0.9437538 0.6098081 0.9502225
[11] 0.9661577 0.8287993 0.9597614 0.8140346 0.8973339 0.9743423 0.8951964 0.9621354 0.9227950 0.9259231
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 0.3920909 0.4193993 0.4243495 0.4382226 0.4396933 0.4856801 0.5140001 0.5229953 0.5396592 0.5463374
[11] 0.5638882 0.5848724 0.5958470 0.6103421 0.6207092 0.6326704 0.6482213 0.6596789 0.6720797 0.6834272
lines(deathsSD_test)

checkresiduals(fit_deathsSD) # passes Ljung-Box test
Ljung-Box test
data: Residuals from ARIMA(4,1,0)
Q* = 27.879, df = 18, p-value = 0.06392
Model df: 4. Total lags used: 22
lines(deathsSD_test)

checkresiduals(fit_deathsSD) # passes Ljung-Box test
Ljung-Box test
data: Residuals from ARIMA(4,1,0)
Q* = 27.879, df = 18, p-value = 0.06392
Model df: 4. Total lags used: 22

# Use best models to forecast further ahead
fc_10_SD <- sarima.for(casesSD, n.ahead = 10, 2, 1, 5)

fc_10_SD$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 286.1869 314.0617 281.5888 252.0685 231.5716 212.9217 201.0289 189.2848 182.8396 175.4861
fcd_10_SD <- sarima.for(deathsSD, n.ahead = 10, 4, 1, 0)

fcd_10_SD <- sarima.for(deathsSD, n.ahead = 10, 4, 1, 0)

fcd_10_SD$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 3.918686 4.102494 2.803120 1.399809 2.378335 3.620602 3.914558 3.172091 2.231339 2.448018
fit_casesSD2 <- arima(casesSD, order = c(2, 1, 5))
checkresiduals(fit_casesSD2) # p-value = 0.018 (closest I could get to 0.05) - not a good model
Ljung-Box test
data: Residuals from ARIMA(2,1,5)
Q* = 28.669, df = 15, p-value = 0.01774
Model df: 7. Total lags used: 22

fit_deathsSD <- auto.arima(deathsSD, stepwise = FALSE, approximation = FALSE)
fit_deathsSD # ARIMA(4, 1, 0), AICc - 217.37
Series: deathsSD
ARIMA(4,1,0)
Coefficients:
ar1 ar2 ar3 ar4
-0.3889 -0.6590 -0.5299 -0.4510
s.e. 0.0930 0.0832 0.0888 0.1015
sigma^2 estimated as 0.4121: log likelihood=-103.39
AIC=216.78 AICc=217.37 BIC=230.14
autoplot(fit_deathsSD)

sarima.for(deathsSD_train, n.ahead = 20, 4, 1, 0)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 0.6879463 0.8160066 0.7666529 0.2831663 1.2283244 0.9142358 0.7809673 0.9437538 0.6098081 0.9502225
[11] 0.9661577 0.8287993 0.9597614 0.8140346 0.8973339 0.9743423 0.8951964 0.9621354 0.9227950 0.9259231
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 0.3920909 0.4193993 0.4243495 0.4382226 0.4396933 0.4856801 0.5140001 0.5229953 0.5396592 0.5463374
[11] 0.5638882 0.5848724 0.5958470 0.6103421 0.6207092 0.6326704 0.6482213 0.6596789 0.6720797 0.6834272
lines(deathsSD_test)

checkresiduals(fit_deathsSD) # passes Ljung-Box test
Ljung-Box test
data: Residuals from ARIMA(4,1,0)
Q* = 27.879, df = 18, p-value = 0.06392
Model df: 4. Total lags used: 22

# Use best models to forecast further ahead
fc_10_SD <- sarima.for(casesSD, n.ahead = 10, 2, 1, 5)

fc_10_SD$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 286.1869 314.0617 281.5888 252.0685 231.5716 212.9217 201.0289 189.2848 182.8396 175.4861
fcd_10_SD <- sarima.for(deathsSD, n.ahead = 10, 4, 1, 0)

fcd_10_SD$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 3.918686 4.102494 2.803120 1.399809 2.378335 3.620602 3.914558 3.172091 2.231339 2.448018
# Repeat for TX
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS, DIFFERENCED DATA SETS
casesTX <- tsTX[, "Cases"]
casesTX_train <- casesTX %>% window(end = c(2020, 120))
casesTX_train <- casesTX %>% window(end = c(2020, 120))
casesTX_test <- casesTX %>% window(end = c(2020, 130))
diff_casesTX <- diff(casesTX)
deathsTX <- tsTX[, "Deaths"]
deathsTX <- tsTX[, "Deaths"]
deathsTX_train <- deathsTX %>% window(end = c(2020, 120))
deathsTX_train <- deathsTX %>% window(end = c(2020, 120))
deathsTX_test <- deathsTX %>% window(end = c(2020, 130))
diff_deathsTX <- diff(deathsTX)
diff_deathsTX <- diff(deathsTX)
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_casesTX <- auto.arima(casesTX, stepwise = FALSE, approximation = FALSE)
fit_casesTX # ARIMA(5, 1, 0), AICc - 1358.83
Series: casesTX
ARIMA(5,1,0) with drift
Coefficients:
ar1 ar2 ar3 ar4 ar5 drift
-0.6897 -0.0959 -0.3050 -0.6786 -0.3295 10.7237
s.e. 0.0906 0.0910 0.0845 0.0881 0.0907 4.0632
sigma^2 estimated as 17299: log likelihood=-671.85
AIC=1357.7 AICc=1358.83 BIC=1376.41
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_casesTX <- auto.arima(casesTX, stepwise = FALSE, approximation = FALSE)
fit_casesTX # ARIMA(5, 1, 0), AICc - 1358.83
Series: casesTX
ARIMA(5,1,0) with drift
Coefficients:
ar1 ar2 ar3 ar4 ar5 drift
-0.6897 -0.0959 -0.3050 -0.6786 -0.3295 10.7237
s.e. 0.0906 0.0910 0.0845 0.0881 0.0907 4.0632
sigma^2 estimated as 17299: log likelihood=-671.85
AIC=1357.7 AICc=1358.83 BIC=1376.41
autoplot(fit_casesTX)

sarima.for(casesTX_train, n.ahead = 20, 5, 1, 0)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 928.6433 1013.9360 614.0468 827.4279 760.7534 858.5194 1044.1534 885.4722 955.4576 842.1049
[11] 822.1472 935.1035 912.2219 1012.1075 980.7167 938.7568 956.7482 918.9534 982.6893 1006.9452
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 116.0575 124.7555 143.6116 146.3068 146.8303 152.0277 153.7902 167.2111 178.8911 181.9872 186.3042
[12] 186.7495 189.3770 194.6034 199.5095 206.9761 210.0200 212.5235 214.8633 217.0844
lines(casesTX_test)

checkresiduals(fit_casesTX) # too low
Ljung-Box test
data: Residuals from ARIMA(5,1,0) with drift
Q* = 40.296, df = 16, p-value = 0.0007048
Model df: 6. Total lags used: 22

fit_casesTX2 <- arima(casesTX, order = c(7, 1, 0))
checkresiduals(fit_casesTX2) # passes the Ljung Box test
Ljung-Box test
data: Residuals from ARIMA(7,1,0)
Q* = 22.883, df = 15, p-value = 0.08665
Model df: 7. Total lags used: 22

fit_deathsTX <- auto.arima(deathsTX, stepwise = FALSE, approximation = FALSE)
fit_deathsTX # ARIMA(5, 1, 0), AICc - 689.06
Series: deathsTX
ARIMA(5,1,0) with drift
Coefficients:
ar1 ar2 ar3 ar4 ar5 drift
-0.5822 -0.0692 -0.3807 -0.6652 -0.2355 0.3269
s.e. 0.0939 0.0891 0.0792 0.0869 0.0932 0.1877
sigma^2 estimated as 33.07: log likelihood=-336.96
AIC=687.92 AICc=689.06 BIC=706.63
fit_deathsTX # ARIMA(5, 1, 0), AICc - 689.06
Series: deathsTX
ARIMA(5,1,0) with drift
Coefficients:
ar1 ar2 ar3 ar4 ar5 drift
-0.5822 -0.0692 -0.3807 -0.6652 -0.2355 0.3269
s.e. 0.0939 0.0891 0.0792 0.0869 0.0932 0.1877
sigma^2 estimated as 33.07: log likelihood=-336.96
AIC=687.92 AICc=689.06 BIC=706.63
autoplot(fit_deathsTX)

sarima.for(deathsTX_train, n.ahead = 20, 5, 1, 0)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 32.954946 21.172757 6.384597 30.738018 33.830672 41.542596 38.961330 18.641371 22.023326 23.109805
[11] 33.453473 43.970925 34.726711 30.373163 23.161839 24.136606 35.708556 38.441232 39.749723 33.404030
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 4.698068 5.047545 5.337290 5.360786 5.510997 5.847467 6.158233 6.713940 7.103123 7.106117 7.125461
[12] 7.152362 7.362992 7.908017 8.054095 8.130455 8.136884 8.151303 8.363989 8.593711
lines(deathsTX_test)

checkresiduals(fit_deathsTX) # passes
Ljung-Box test
data: Residuals from ARIMA(5,1,0) with drift
Q* = 16.177, df = 16, p-value = 0.4407
Model df: 6. Total lags used: 22
lines(deathsTX_test)

checkresiduals(fit_deathsTX) # passes
Ljung-Box test
data: Residuals from ARIMA(5,1,0) with drift
Q* = 16.177, df = 16, p-value = 0.4407
Model df: 6. Total lags used: 22

# Use best models to forecast further ahead
fc_10_TX <- sarima.for(casesTX, n.ahead = 10, 7, 1, 0)

fc_10_TX$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 1036.677 1062.171 1099.984 1071.121 1248.110 1200.434 1179.260 1168.616 1130.126 1153.625
fcd_10_TX <- sarima.for(deathsTX, n.ahead = 10, 5, 1, 0)

fcd_10_TX$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 36.43089 34.04652 29.87068 32.38012 35.87844 38.87863 40.23278 38.17785 36.17898 35.10841
V. County level time series analysis A. Filter data to 34 key counties (MN - 9, CO - 8, MI - 4, NE - 4, PA - 3, SD - 2, TX - 4) B. Replicate ARIMA models for each county C. Forecast 10 days out
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_Tarrant_cases <- auto.arima(Tarrant_cases, stepwise = FALSE, approximation = FALSE)
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_Tarrant_cases <- auto.arima(Tarrant_cases, stepwise = FALSE, approximation = FALSE)
fit_Tarrant_cases # ARIMA(3, 1, 2), AICc - 1076.92
Series: Tarrant_cases
ARIMA(3,1,2) with drift
Coefficients:
ar1 ar2 ar3 ma1 ma2 drift
0.6389 0.1859 -0.2497 -1.8684 0.9229 0.9503
s.e. 0.1086 0.1168 0.1208 0.0662 0.0556 0.4227
sigma^2 estimated as 1219: log likelihood=-530.89
AIC=1075.78 AICc=1076.92 BIC=1094.49
autoplot(fit_Tarrant_cases)

autoplot(fit_Tarrant_cases)

sarima.for(Tarrant_cases_train, n.ahead = 20, 3, 1, 2)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 89.82678 71.49481 90.46510 77.39054 89.05233 82.29664 88.62381 85.85879 89.23810 88.53458 90.48947
[12] 90.73914 92.06385 92.72083 93.78557 94.60540 95.56952 96.45040 97.37808 98.28026
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 27.20873 28.37068 28.69945 29.90789 29.92150 30.68212 30.71986 31.17960 31.27613 31.58981 31.73717
[12] 31.98524 32.16164 32.38046 32.56967 32.77506 32.96846 33.16715 33.36083 33.55561

autoplot(fit_Tarrant_cases)

sarima.for(Tarrant_cases_train, n.ahead = 20, 3, 1, 2)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 89.82678 71.49481 90.46510 77.39054 89.05233 82.29664 88.62381 85.85879 89.23810 88.53458 90.48947
[12] 90.73914 92.06385 92.72083 93.78557 94.60540 95.56952 96.45040 97.37808 98.28026
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 27.20873 28.37068 28.69945 29.90789 29.92150 30.68212 30.71986 31.17960 31.27613 31.58981 31.73717
[12] 31.98524 32.16164 32.38046 32.56967 32.77506 32.96846 33.16715 33.36083 33.55561
lines(Tarrant_cases_test)
lines(Tarrant_cases_test)

checkresiduals(fit_Tarrant_cases) # does not pass Ljung Box test
Ljung-Box test
data: Residuals from ARIMA(3,1,2) with drift
Q* = 31.754, df = 16, p-value = 0.01076
Model df: 6. Total lags used: 22

fit_Tarrant_cases2 <- arima(Tarrant_cases, order = c(3, 1, 8))
checkresiduals(fit_Tarrant_cases) # does not pass Ljung Box test
Ljung-Box test
data: Residuals from ARIMA(3,1,2) with drift
Q* = 31.754, df = 16, p-value = 0.01076
Model df: 6. Total lags used: 22

fit_Tarrant_cases2 <- arima(Tarrant_cases, order = c(3, 1, 8))
checkresiduals(fit_Tarrant_cases2) # passes
Ljung-Box test
data: Residuals from ARIMA(3,1,8)
Q* = 18.296, df = 11, p-value = 0.07496
Model df: 11. Total lags used: 22

fit_Tarrant_deaths <- auto.arima(Tarrant_deaths, stepwise = FALSE, approximation = FALSE)
fit_Tarrant_deaths # ARIMA(2, 1, 3), AICc - 375.33
Series: Tarrant_deaths
ARIMA(2,1,3)
Coefficients:
ar1 ar2 ma1 ma2 ma3
-0.2626 0.2820 -0.6236 -0.8434 0.7056
s.e. 0.1527 0.1439 0.1137 0.0602 0.1032
sigma^2 estimated as 1.764: log likelihood=-181.24
AIC=374.49 AICc=375.33 BIC=390.52
fit_Tarrant_deaths <- auto.arima(Tarrant_deaths, stepwise = FALSE, approximation = FALSE)
fit_Tarrant_deaths # ARIMA(2, 1, 3), AICc - 375.33
Series: Tarrant_deaths
ARIMA(2,1,3)
Coefficients:
ar1 ar2 ma1 ma2 ma3
-0.2626 0.2820 -0.6236 -0.8434 0.7056
s.e. 0.1527 0.1439 0.1137 0.0602 0.1032
sigma^2 estimated as 1.764: log likelihood=-181.24
AIC=374.49 AICc=375.33 BIC=390.52
autoplot(fit_Tarrant_deaths)

fit_Tarrant_deaths # ARIMA(2, 1, 3), AICc - 375.33
Series: Tarrant_deaths
ARIMA(2,1,3)
Coefficients:
ar1 ar2 ma1 ma2 ma3
-0.2626 0.2820 -0.6236 -0.8434 0.7056
s.e. 0.1527 0.1439 0.1137 0.0602 0.1032
sigma^2 estimated as 1.764: log likelihood=-181.24
AIC=374.49 AICc=375.33 BIC=390.52
autoplot(fit_Tarrant_deaths)

sarima.for(Tarrant_deaths_train, n.ahead = 20, 2, 1, 3)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 1.437549 2.375279 1.894045 2.274475 2.086029 2.250629 2.185897 2.265192 2.251753 2.296933 2.304551
[12] 2.335998 2.352216 2.378113 2.397833 2.421484 2.442628 2.465368 2.487091 2.509461
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 0.9729671 0.9738641 0.9928969 0.9974776 1.0140056 1.0234201 1.0377454 1.0489840 1.0620761 1.0738322
[11] 1.0862361 1.0980271 1.1099984 1.1216529 1.1333085 1.1447699 1.1561657 1.1674202 1.1785863 1.1896355
lines(Tarrant_deaths_test)

sarima.for(Tarrant_deaths_train, n.ahead = 20, 2, 1, 3)
$pred
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 1.437549 2.375279 1.894045 2.274475 2.086029 2.250629 2.185897 2.265192 2.251753 2.296933 2.304551
[12] 2.335998 2.352216 2.378113 2.397833 2.421484 2.442628 2.465368 2.487091 2.509461
$se
Time Series:
Start = c(2020, 121)
End = c(2020, 140)
Frequency = 365
[1] 0.9729671 0.9738641 0.9928969 0.9974776 1.0140056 1.0234201 1.0377454 1.0489840 1.0620761 1.0738322
[11] 1.0862361 1.0980271 1.1099984 1.1216529 1.1333085 1.1447699 1.1561657 1.1674202 1.1785863 1.1896355
lines(Tarrant_deaths_test)

checkresiduals(fit_Tarrant_deaths) # does not pass
Ljung-Box test
data: Residuals from ARIMA(2,1,3)
Q* = 42.544, df = 17, p-value = 0.0005594
Model df: 5. Total lags used: 22

fit_Tarrant_deaths2 <- arima(Tarrant_deaths, order = c(2, 2, 6))
checkresiduals(fit_Tarrant_deaths2) # passes
Ljung-Box test
data: Residuals from ARIMA(2,2,6)
Q* = 22.922, df = 14, p-value = 0.06155
Model df: 8. Total lags used: 22

fit_Tarrant_deaths2 <- arima(Tarrant_deaths, order = c(2, 2, 6))
checkresiduals(fit_Tarrant_deaths2) # passes
Ljung-Box test
data: Residuals from ARIMA(2,2,6)
Q* = 22.922, df = 14, p-value = 0.06155
Model df: 8. Total lags used: 22

# Use best models to forecast further ahead
fc_10_Tarrant <- sarima.for(Tarrant_cases, n.ahead = 10, 3, 1, 8)

# Use best models to forecast further ahead
fc_10_Tarrant <- sarima.for(Tarrant_cases, n.ahead = 10, 3, 1, 8)
fc_10_Tarrant$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 116.19146 89.58502 150.79515 32.90965 177.56836 81.34822 119.76881 130.77723 96.63236 138.87275
lines(Tarrant_deaths_test)

checkresiduals(fit_Tarrant_deaths) # does not pass
Ljung-Box test
data: Residuals from ARIMA(2,1,3)
Q* = 42.544, df = 17, p-value = 0.0005594
Model df: 5. Total lags used: 22

fit_Tarrant_deaths2 <- arima(Tarrant_deaths, order = c(2, 2, 6))
checkresiduals(fit_Tarrant_deaths2) # passes
Ljung-Box test
data: Residuals from ARIMA(2,2,6)
Q* = 22.922, df = 14, p-value = 0.06155
Model df: 8. Total lags used: 22

# Use best models to forecast further ahead
fc_10_Tarrant <- sarima.for(Tarrant_cases, n.ahead = 10, 3, 1, 8)

fc_10_Tarrant$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 116.19146 89.58502 150.79515 32.90965 177.56836 81.34822 119.76881 130.77723 96.63236 138.87275
fcd_10_Tarrant <- sarima.for(Tarrant_deaths, n.ahead = 10, 2, 2, 6)
lines(Tarrant_deaths_test)

checkresiduals(fit_Tarrant_deaths) # does not pass
Ljung-Box test
data: Residuals from ARIMA(2,1,3)
Q* = 42.544, df = 17, p-value = 0.0005594
Model df: 5. Total lags used: 22

fit_Tarrant_deaths2 <- arima(Tarrant_deaths, order = c(2, 2, 6))
checkresiduals(fit_Tarrant_deaths2) # passes
Ljung-Box test
data: Residuals from ARIMA(2,2,6)
Q* = 22.922, df = 14, p-value = 0.06155
Model df: 8. Total lags used: 22

# Use best models to forecast further ahead
fc_10_Tarrant <- sarima.for(Tarrant_cases, n.ahead = 10, 3, 1, 8)

fc_10_Tarrant$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 116.19146 89.58502 150.79515 32.90965 177.56836 81.34822 119.76881 130.77723 96.63236 138.87275
fcd_10_Tarrant <- sarima.for(Tarrant_deaths, n.ahead = 10, 2, 2, 6)

fcd_10_Tarrant$pred
Time Series:
Start = c(2020, 131)
End = c(2020, 140)
Frequency = 365
[1] 3.126920 5.342878 3.640292 3.691021 5.676126 2.693883 5.921924 3.462516 4.858318 4.844965
V. Linear Regression on MN counties to account for constants A. Load current data and add constant variables B. Reshape data into long and wide forms C. Build linear regression models for cases and deaths
# load in MN county level data from usafacts (wide form)
# http://www.cookbook-r.com/Manipulating_data/Converting_data_between_wide_and_long_format/
MN_0613 <- MN_0613 %>% filter(State == "MN") %>% filter(FIPS != "0") # remove unallocated cases
Error: Problem with `filter()` input `..1`.
x object 'State' not found
ℹ Input `..1` is `State == "MN"`.
- Vector Autoregression (VAR) A. Perform VAR on MN counties (9) and select counties (3) B. Perform VAR on US states (7) and select states(3) C. Forecast 12 days out on all models
- Final model check A. Load current data through June 24th (COVID cases and deaths) B. Check predictions from 3 key county models against current data (ARIMA, VAR, Regression) C. Check predictions for state of MN against current data (ARIMA, VAR)
# ADD MORE RECENT DATA TO US, MN, SELECT COUNTIES (FROM USAFACTS)
# RERUN TS FORECASTS USING UPDATED DATA AND MEASURE ACCURACY, PREDICT NEXT 10 DAYS
# data through 06/12/2020
# https://usafacts.org/visualizations/coronavirus-covid-19-spread-map/
# steps to combine data
# filter cases to single county
MN0612c <- cases0612 %>% filter(State == "MN")
Hennepin0612c <- MN0612c %>% filter(County.Name == "Hennepin County")
Hennepin0612c <- Hennepin0612c[, 5:148]
dim(Hennepin0612c)
class(Hennepin0612c)
# invert columns and rows
x <- as.data.frame(t(Hennepin0612c))
dim(x)
class(x)
colnames(x) <- "V1"
str(x)
start <- x[1, 1]
start
tail(x)
# add col that shows difference between values (USAfacts data is cumulative)
x$diff <- c(start, diff(x$V1))
x
colnames(x) <- c("Cum", "Cases")
# repeat for deaths
MN0612d <- deaths0612 %>% filter(State == "MN")
Hennepin0612d <- MN0612d %>% filter(County.Name == "Hennepin County")
Hennepin0612d <- Hennepin0612d[, 5:148]
str(Hennepin0612d)
dim(Hennepin0612d)
# invert columns and rows
y <- as.data.frame(t(Hennepin0612d))
dim(y)
colnames(y) <- "V1"
str(y)
start <- y[1, 1]
start
tail(y)
# add col that shows difference between values (USAfacts data is cumulative)
y$diff <- c(start, diff(y$V1))
head(y)
tail(y)
colnames(y) <- c("Cum", "Deaths")
# combine Cases and Deaths
HennMN0612 <- cbind(x$Cases, y$Deaths)
colnames(HennMN0612) <- c("Cases", "Deaths")
HennMN0612
str(HennMN0612)
tail(HennMN0612)
HennMNts <- ts(HennMN0612, start = c(2020, 22), frequency = 365)
str(HennMNts)
head(HennMNts)
HennMNts
autoplot(HennMNts, main = "COVID-19 Cases and Deaths - Minnesota")
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS
autoplot(HennMNts)
Henn_cases <- HennMNts[, "Cases"]
Henn_cases_train <- Henn_cases %>% window(end = c(2020, 124))
Henn_cases_test <- Henn_cases %>% window(end = c(2020, 144))
Henn_deaths <- HennMNts[, "Deaths"]
Henn_deaths_train <- Henn_deaths %>% window(end = c(2020, 124))
Henn_deaths_test <- Henn_deaths %>% window(end = c(2020, 144))
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_Henn_cases <- auto.arima(Henn_cases, stepwise = FALSE, approximation = FALSE)
fit_Henn_cases # ARIMA(0, 1, 1), AICc - 1603.27
autoplot(fit_Henn_cases)
sarima.for(Henn_cases_train, n.ahead = 20, 0, 1, 1)
lines(Henn_cases_test)
checkresiduals(fit_Henn_cases) # passes
fit_Henn_deaths <- auto.arima(Henn_deaths, stepwise = FALSE, approximation = FALSE)
fit_Henn_deaths # ARIMA(3, 1, 2), AICc - 725.33
autoplot(fit_Henn_deaths)
sarima.for(Henn_deaths_train, n.ahead = 20, 3, 1, 2)
lines(Henn_deaths_test)
checkresiduals(fit_Henn_deaths) # p-value too low, does not pass Ljung-Box test
fit_Henn_deaths2 <- arima(Henn_deaths, order = c(6, 1, 1))
sarima.for(Henn_deaths_train, n.ahead = 20, 6, 1, 1)
lines(Henn_deaths_test)
checkresiduals(fit_Henn_deaths2) # passes
# Use best models to forecast further ahead
fc_10_Henn <- sarima.for(Henn_cases, n.ahead = 10, 0, 1, 1)
fc_10_Henn$pred
fcd_10_Henn <- sarima.for(Henn_deaths, n.ahead = 10, 6, 1, 1)
fcd_10_Henn$pred
# REPEAT PROCESS
# steps to combine data
# filter cases to single county
MN0612c <- cases0612 %>% filter(State == "MN")
Stearns0612c <- MN0612c %>% filter(County.Name == "Stearns County")
Stearns0612c <- Stearns0612c[, 5:148]
dim(Stearns0612c)
# invert columns and rows
x <- as.data.frame(t(Stearns0612c))
colnames(x) <- "V1"
start <- x[1, 1]
start
# add col that shows difference between values (USAfacts data is cumulative)
x$diff <- c(start, diff(x$V1))
colnames(x) <- c("Cum", "Cases")
# repeat for deaths
MN0612d <- deaths0612 %>% filter(State == "MN")
Stearns0612d <- MN0612d %>% filter(County.Name == "Stearns County")
Stearns0612d <- Stearns0612d[, 5:148]
dim(Stearns0612d)
# invert columns and rows
y <- as.data.frame(t(Stearns0612d))
colnames(y) <- "V1"
start <- y[1, 1]
start
# add col that shows difference between values (USAfacts data is cumulative)
y$diff <- c(start, diff(y$V1))
colnames(y) <- c("Cum", "Deaths")
# combine Cases and Deaths
StearnsMN0612 <- cbind(x$Cases, y$Deaths)
colnames(StearnsMN0612) <- c("Cases", "Deaths")
StearnsMNts <- ts(StearnsMN0612, start = c(2020, 22), frequency = 365)
autoplot(StearnsMNts, main = "COVID-19 Cases and Deaths - MN, Stearns County")
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS
autoplot(StearnsMNts)
Stearns_cases <- StearnsMNts[, "Cases"]
Stearns_cases_train <- Stearns_cases %>% window(end = c(2020, 124))
Stearns_cases_test <- Stearns_cases %>% window(end = c(2020, 144))
Stearns_deaths <- StearnsMNts[, "Deaths"]
Stearns_deaths_train <- Stearns_deaths %>% window(end = c(2020, 124))
Stearns_deaths_test <- Stearns_deaths %>% window(end = c(2020, 144))
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_Stearns_cases <- auto.arima(Stearns_cases, stepwise = FALSE, approximation = FALSE)
fit_Stearns_cases # ARIMA(4, 1, 0), AICc - 1197.98
autoplot(fit_Stearns_cases)
sarima.for(Stearns_cases_train, n.ahead = 20, 4, 1, 0)
lines(Stearns_cases_test)
checkresiduals(fit_Stearns_cases) # p-value too low
fit_Stearns_cases2 <- arima(Stearns_cases, order = c(4, 1, 2))
checkresiduals(fit_Stearns_cases2) # passes
fit_Stearns_deaths <- auto.arima(Stearns_deaths, stepwise = FALSE, approximation = FALSE)
fit_Stearns_deaths # ARIMA(0, 1, 5), AICc - 94.28
autoplot(fit_Stearns_deaths)
sarima.for(Stearns_deaths_train, n.ahead = 20, 0, 1, 5)
checkresiduals(fit_Stearns_deaths) # p-value too low, does not pass Ljung-Box test
fit_Stearns_deaths2 <- arima(Stearns_deaths, order = c(0, 1, 6))
checkresiduals(fit_Stearns_deaths2) # passes
# Use best models to forecast further ahead
fc_10_Stearns <- sarima.for(Stearns_cases, n.ahead = 10, 4, 1, 2)
fc_10_Stearns$pred
fcd_10_Stearns <- sarima.for(Stearns_deaths, n.ahead = 10, 0, 1, 6)
fcd_10_Stearns$pred
# REPEAT PROCESS
# steps to combine data
# filter cases to single county
MN0612c <- cases0612 %>% filter(State == "MN")
Kandiyohi0612c <- MN0612c %>% filter(County.Name == "Kandiyohi County")
Kandiyohi0612c <- Kandiyohi0612c[, 5:148]
dim(Kandiyohi0612c)
# invert columns and rows
x <- as.data.frame(t(Kandiyohi0612c))
colnames(x) <- "V1"
start <- x[1, 1]
start
# add col that shows difference between values (USAfacts data is cumulative)
x$diff <- c(start, diff(x$V1))
colnames(x) <- c("Cum", "Cases")
# repeat for deaths
MN0612d <- deaths0612 %>% filter(State == "MN")
Kandiyohi0612d <- MN0612d %>% filter(County.Name == "Kandiyohi County")
Kandiyohi0612d <- Kandiyohi0612d[, 5:148]
dim(Kandiyohi0612d)
# invert columns and rows
y <- as.data.frame(t(Kandiyohi0612d))
colnames(y) <- "V1"
start <- y[1, 1]
start
# add col that shows difference between values (USAfacts data is cumulative)
y$diff <- c(start, diff(y$V1))
colnames(y) <- c("Cum", "Deaths")
# combine Cases and Deaths
KandiyohiMN0612 <- cbind(x$Cases, y$Deaths)
colnames(KandiyohiMN0612) <- c("Cases", "Deaths")
KandiyohiMNts <- ts(KandiyohiMN0612, start = c(2020, 22), frequency = 365)
autoplot(KandiyohiMNts, main = "COVID-19 Cases and Deaths - MN, Kandiyohi County")
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS
autoplot(KandiyohiMNts)
Kandiyohi_cases <- KandiyohiMNts[, "Cases"]
Kandiyohi_cases_train <- Kandiyohi_cases %>% window(end = c(2020, 124))
Kandiyohi_cases_test <- Kandiyohi_cases %>% window(end = c(2020, 144))
Kandiyohi_deaths <- KandiyohiMNts[, "Deaths"]
Kandiyohi_deaths_train <- Kandiyohi_deaths %>% window(end = c(2020, 124))
Kandiyohi_deaths_test <- Kandiyohi_deaths %>% window(end = c(2020, 144))
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_Kandiyohi_cases <- auto.arima(Kandiyohi_cases, stepwise = FALSE, approximation = FALSE)
fit_Kandiyohi_cases # ARIMA(2, 1, 3), AICc - 914.05
autoplot(fit_Kandiyohi_cases)
sarima.for(Kandiyohi_cases_train, n.ahead = 20, 2, 1, 3)
lines(Kandiyohi_cases_test)
checkresiduals(fit_Kandiyohi_cases) # passes
fit_Kandiyohi_deaths <- auto.arima(Kandiyohi_deaths, stepwise = FALSE, approximation = FALSE)
fit_Kandiyohi_deaths # ARIMA(0, 0, 0), AICc - -304.97 White noise model
autoplot(fit_Kandiyohi_deaths)
sarima.for(Kandiyohi_deaths_train, n.ahead = 20, 0, 0, 0)
checkresiduals(fit_Kandiyohi_deaths) # passes Ljung-Box test
# Use best models to forecast further ahead
fc_10_Kandiyohi <- sarima.for(Kandiyohi_cases, n.ahead = 10, 2, 1, 3)
fc_10_Kandiyohi$pred
fcd_10_Kandiyohi <- sarima.for(Kandiyohi_deaths, n.ahead = 10, 0, 0, 0)
fcd_10_Kandiyohi$pred
# REPEAT for MN Data (full state)
MN0612c <- cases0612 %>% filter(State == "MN")
MN0612c <- MN0612c[, 5:148]
dim(MN0612c)
total <- colSums(MN0612c)
length(total)
total <- as.integer(total)
MN0612c <- rbind(MN0612c, total)
class(MN0612c)
MN0612c <- MN0612c[89, ]
MN0612c
# invert columns and rows
x <- as.data.frame(t(MN0612c))
class(x)
str(x)
colnames(x) <- "V1"
str(x)
start <- x[1, 1]
start
# add col that shows difference between values (USAfacts data is cumulative)
x$diff <- c(start, diff(x$V1))
colnames(x) <- c("Cum", "Cases")
tail(x)
# repeat for deaths (full state)
MN0612d <- deaths0612 %>% filter(State == "MN")
MN0612d <- MN0612d[, 5:148]
dim(MN0612d)
total <- colSums(MN0612d)
length(total)
total <- as.integer(total)
MN0612d <- rbind(MN0612d, total)
class(MN0612d)
MN0612d <- MN0612d[89, ]
MN0612d
# invert columns and rows
y <- as.data.frame(t(MN0612d))
colnames(y) <- "V1"
str(y)
start <- y[1, 1]
start
# add col that shows difference between values (USAfacts data is cumulative)
y$diff <- c(start, diff(y$V1))
colnames(y) <- c("Cum", "Deaths")
tail(y)
# combine Cases and Deaths
MN0612 <- cbind(x$Cases, y$Deaths)
colnames(MN0612) <- c("Cases", "Deaths")
MNts <- ts(MN0612, start = c(2020, 22), frequency = 365)
autoplot(MNts, main = "COVID-19 Cases and Deaths - MN")
# CREATE TEST/TRAIN SETS FOR CASES AND DEATHS
autoplot(MNts)
MN_cases <- MNts[, "Cases"]
MN_cases_train <- MN_cases %>% window(end = c(2020, 124))
MN_cases_test <- MN_cases %>% window(end = c(2020, 144))
MN_deaths <- MNts[, "Deaths"]
MN_deaths_train <- MN_deaths %>% window(end = c(2020, 124))
MN_deaths_test <- MN_deaths %>% window(end = c(2020, 144))
# BEST MODELS - use auto.arima models for simplicity and consistency
fit_MN_cases <- auto.arima(MN_cases, stepwise = FALSE, approximation = FALSE)
fit_MN_cases # ARIMA(3, 1, 2), AICc - 1716.48
autoplot(fit_MN_cases)
sarima.for(MN_cases_train, n.ahead = 20, 3, 1, 2)
lines(MN_cases_test)
checkresiduals(fit_MN_cases) # passes
fit_MN_deaths <- auto.arima(MN_deaths, stepwise = FALSE, approximation = FALSE)
fit_MN_deaths # ARIMA(3, 1, 2), AICc - 836.77
autoplot(fit_MN_deaths)
sarima.for(MN_deaths_train, n.ahead = 20, 3, 1, 2)
lines(MN_deaths_test)
checkresiduals(fit_MN_deaths) # does not pass
fit_MN_deaths2 <- arima(MN_deaths, order = c(4, 1, 3))
checkresiduals(fit_MN_deaths2) # passes
sarima.for(MN_deaths_train, n.ahead = 20, 4, 1, 3)
lines(MN_deaths_test)
# Use best models to forecast further ahead
fc_10_MN <- sarima.for(MN_cases, n.ahead = 10, 3, 1, 2)
fc_10_MN$pred
fcd_10_MN <- sarima.for(MN_deaths, n.ahead = 10, 4, 1, 3)
fcd_10_MN$pred
LS0tCnRpdGxlOiAiRm9yZWNhc3RpbmcgQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyBVc2luZyBUaW1lIFNlcmllcyBBbmFseXNpcyBpbiBSIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyfQojIFJ1biBpbiBjb25zb2xlIHByaW9yIHRvIHJ1bm5pbmcgY2h1bmtzOgpnZXR3ZCgpCnNldHdkKCcvVXNlcnMvcmVnaW5hZHV2YWwvR3JhZF9Xb3JrL01TRFM2OTJfUHJhY3RpY3VtMS9Qcm9qZWN0L0RhdGEnKQpkaXN0IDwtIHJlYWQuY3N2KCJDb3VudHlfZGF0YV9kaXN0YW5jZS5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCnRyYWluIDwtIHJlYWQuY3N2KCJ0cmFpbjIuY3N2IiwgaGVhZGVyID0gVFJVRSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpwb3AgPC0gcmVhZC5jc3YoImNvdmlkX2NvdW50eV9wb3B1bGF0aW9uX3VzYWZhY3RzLmNzdiIpCnRvdGFsX2Nhc2VzIDwtIHJlYWQuY3N2KCJ0b3RhbF9jYXNlcy5jc3YiLCBoZWFkZXIgPSBUUlVFKQp0b3RhbF9kZWF0aHMgPC0gcmVhZC5jc3YoInRvdGFsX2RlYXRocy5jc3YiLCBoZWFkZXIgPSBUUlVFKQpkaXN0MiA8LSByZWFkLmNzdigiU2VsZWN0X2NvdW50eV9kYXRhX2Rpc3RhbmNlLmNzdiIsIGhlYWRlciA9IFRSVUUpCk1OXzljdW0gPC0gcmVhZC5jc3YoIk1OXzlfMDYxMy5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCk1OXzlkY3VtIDwtIHJlYWQuY3N2KCJNTl85ZF8wNjEzLmNzdiIsIGhlYWRlciA9IFRSVUUsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKTU5fMDYxMyA8LSByZWFkLmNzdigiY292aWRfY2FzZXNfMDYxMy5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmNvdW50eV9kYXRhIDwtIHJlYWQuY3N2KCJDb3VudHlfZGF0YV9kaXN0YW5jZTIuY3N2IiwgaGVhZGVyID0gVFJVRSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpNTl8wNjEzZCA8LSByZWFkLmNzdigiY292aWRfZGVhdGhzXzA2MTMuY3N2IiwgaGVhZGVyID0gVFJVRSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpVU183Y3VtIDwtIHJlYWQuY3N2KCJjb3ZpZF9jYXNlc18wNjEzIGNvcHkuY3N2IiwgaGVhZGVyID0gVFJVRSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpVU183ZGN1bSA8LSByZWFkLmNzdigiY292aWRfZGVhdGhzXzA2MTMgY29weS5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmNhc2VzMDYxMiA8LSByZWFkLmNzdigiY292aWRfY29uZmlybWVkX3VzYWZhY3RzLmNzdiIsIGhlYWRlciA9IFRSVUUsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKZGVhdGhzMDYxMiA8LSByZWFkLmNzdigiY292aWRfZGVhdGhzX3VzYWZhY3RzLmNzdiIsIGhlYWRlciA9IFRSVUUsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKCmBgYAoKSS4gRGF0YSBjb2xsZWN0aW9uIGFuZCBjbGVhbiB1cAogIEEuIFB1bGwgaW5pdGlhbCBkYXRhIGZyb20gS2FnZ2xlIGNvbXBldGl0aW9uCiAgQi4gSW52ZXN0aWdhdGUgYWRkaXRpb25hbCBkYXRhIHBvaW50cyBsaWtlIHBvcHVsYXRpb24sIGRpc3RhbmNlLCBhbmQgbWVhdC1wYWNraW5nIHBsYW50cyBhdCBjb3VudHkgbGV2ZWwKICBDLiBDb21iaW5lIGRhdGEgYW5kIHB1dCBpbnRvIGNvcnJlY3QgZm9ybWF0IGZvciBFREEgYW5kIHRpbWUgc2VyaWVzIGFuYWx5c2lzCgpgYGB7cn0KbGlicmFyeShhc3RzYSkKbGlicmFyeShicm9vbSkKbGlicmFyeShjYXJldCkKbGlicmFyeShEQUFHKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGR5bmxtKQpsaWJyYXJ5KGZvcmVjYXN0KQpsaWJyYXJ5KGZwcDIpCmxpYnJhcnkoZnVuTW9kZWxpbmcpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoTUFSU1MpCmxpYnJhcnkobWF0cml4U3RhdHMpCmxpYnJhcnkoTVRTKQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KHJlYWR4bCkgCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHRpZHljZW5zdXMpCmxpYnJhcnkodG1hcCkKbGlicmFyeSh0bWFwdG9vbHMpCmxpYnJhcnkodHNlcmllcykKbGlicmFyeSh1cmJubWFwcikKbGlicmFyeSh1cmNhKQpsaWJyYXJ5KHZhcmhhbmRsZSkKbGlicmFyeSh2YXJzKQoKIyAjIFJldmlldyBmaWxlcyBmcm9tIEthZ2dsZSBjb21wZXRpdGlvbgojIHRyYWluIDwtIHJlYWQuY3N2KCJ0cmFpbi5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiMgIyBicmVhayBvdXQgY2FzZXMgYW5kIGRlYXRocwojIHRyYWluX2Nhc2VzIDwtIHRyYWluICU+JSBmaWx0ZXIoVGFyZ2V0ID09ICJDb25maXJtZWRDYXNlcyIpCiMgdHJhaW5fY2FzZXMkQ2FzZXMgPC0gdHJhaW5fY2FzZXMkVGFyZ2V0VmFsdWUKIyB0cmFpbl9kZWF0aHMgPC0gdHJhaW4gJT4lIGZpbHRlcihUYXJnZXQgPT0gIkZhdGFsaXRpZXMiKQojIHRyYWluX2RlYXRocyREZWF0aHMgPC0gdHJhaW5fZGVhdGhzJFRhcmdldFZhbHVlCiMgIyBtZXJnZSBiYWNrIHRvIG9uZSBkYXRhc2V0CiMgdHJhaW4yIDwtIG1lcmdlKHRyYWluX2Nhc2VzWywgYygyLCAzLCA0LCA1LCA3LCAxMCldLCB0cmFpbl9kZWF0aHNbLCBjKDIsIDMsIDQsIDUsIDcsIDEwKV0pCiMgIyBjb252ZXJ0IGRhdGUgY29sdW1uIHRvIGRhdGUgZm9ybWF0IChmb3IgRURBKQojIHRyYWluMiREYXRlIDwtIGFzLkRhdGUodHJhaW4yJERhdGUpCiMgIyBzYXZlIHRyYWluMgojIHdyaXRlLmNzdih0cmFpbjIsICJ0cmFpbjIuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCgojICMgQ3JlYXRlIG5ldyBmaWxlIHdpdGggZXh0cmEgdmFyaWFibGVzIChwb3AsIGRpc3QsIG1lYXQpIGJ5IEZJUFMKIyBjbGFzcyhkYXRhKQojIGhlYWQoZGF0YSkKIyBoZWFkKGRhdGEyKQojIHRhaWwoZGF0YTMpCiMgZGF0YTMkY29uY2F0ZW5hdGUgPC0gcGFzdGUwKGRhdGEzJGNvdW50eTEsIGRhdGEzJGNvdW50eTIpCiMgdGFpbChkYXRhMykKIyBoZWFkKGRhdGE0KQojIGRhdGE0IDwtIGRhdGE0WywgMTo2XQojIGhlYWQoZGF0YTQpCiMgZGF0YTQkY29uY2F0ZW5hdGUgPC0gZGF0YTQkY29uY2F0ZW5hdGVfQkQKIyBoZWFkKGRhdGE0KQojIGRhdGE0IDwtIGRhdGE0WywgLTZdCiMgaGVhZChkYXRhNCkKIyBkaW0oZGF0YTQpCiMgZGF0YV9mdWxsIDwtIG1lcmdlKGRhdGEzWywgYygiY29uY2F0ZW5hdGUiLCAibWlfdG9fY291bnR5IildLCBkYXRhNCwgYnkueSwgYWxsLnkgPSBhbGwpCiMgdGFpbChkYXRhX2Z1bGwpCiMgc3VtbWFyeShkYXRhX2Z1bGwpCiMgc3RyKGRhdGFfZnVsbCkKIyBkYXRhX2Z1bGwkc3RhdGUgPC0gYXMuY2hhcmFjdGVyKGRhdGFfZnVsbCRzdGF0ZSkKIyBkYXRhX2Z1bGwgPC0gZGF0YV9mdWxsICU+JSBhcnJhbmdlKHN0YXRlKQojIGhlYWQoZGF0YV9mdWxsKQojIGZpbmFsX2RhdGEgPC0gZGF0YV9mdWxsWywgYygzLCA0LCA1LCA2LCA3LCAyKV0KIyBoZWFkKGZpbmFsX2RhdGEpCiMgaXMubmEoZmluYWxfZGF0YSkKIyAjIHdyaXRlLmNzdihmaW5hbF9kYXRhLCAiQ291bnR5X2RhdGFfZGlzdGFuY2UuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCgojIGFkZCBwb3AgdG8gIkNvdW50eV9kYXRhX2Rpc3RhbmNlLmNzdiIgZnJvbSB0cmFpbjIgZGF0YXNldAojIGNvbWJpbmUgY291bnR5IGRhdGEgd2l0aCB0cmFpbjIgZGF0YXNldApoZWFkKGRpc3QpCmRpbShkaXN0KQp0cmFpbl9VUyA8LSB0cmFpbiAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJVUyIpICU+JSBmaWx0ZXIoQ291bnR5ICE9ICIiKQp0cmFpbl9VUyRjb25jYXRlbmF0ZSA8LSBwYXN0ZSh0cmFpbl9VUyRDb3VudHksIHRyYWluX1VTJFByb3ZpbmNlX1N0YXRlLCBzZXAgPSAiIikKaGVhZCh0cmFpbl9VUykKZGltKHRyYWluX1VTKQp0cmFpbl9VUyA8LSB0cmFpbl9VU1ssIGMoNCwgOCldCmRpc3QyIDwtIGxlZnRfam9pbihkaXN0LCB0cmFpbl9VUywgYnkgPSAiY29uY2F0ZW5hdGUiKQpkaW0oZGlzdDIpCmhlYWQoZGlzdDIpCmRpc3QyIDwtIHVuaXF1ZShkaXN0MikKZGltKGRpc3QyKQpoZWFkKGRpc3QyKQojIHdyaXRlLmNzdihkaXN0MiwgIkRpc3RhbmNlIERhdGEvQ291bnR5X2RhdGFfZGlzdGFuY2UyLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQpgYGAKSUkuIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMKICBBLiBCYXNpYyBFREEgb24gY291bnR5IGRhdGEKICBCLiBTZWxlY3Qgc3BlY2lmaWMgY291bnRpZXMgdG8gYW5hbHl6ZSBtb3JlIGNsb3NlbHkKICBDLiBBZGQgZ2VvZ3JhcGhpYyBkYXRhIHRvIG1hcCBmdWxsIFVTIGRhdGEgYW5kIE1OIGRhdGEKICAKYGBge3J9CiMgbG9hZCBmaWxlIGNvbnRhaW5pbmcgY291bnR5IGRpc3RhbmNlcwpoZWFkKGRpc3QsIDEwKQojIGFkZCBmaWxlIHdpdGggcG9wdWxhdGlvbgpoZWFkKHBvcCwgMTApCiMgbGVmdCBqb2luIGRpc3QgYW5kIHBvcApkaXN0MSA8LSBsZWZ0X2pvaW4oZGlzdCwgcG9wLCBieSA9ICJGSVBTIikKIyBwZXJmb3JtIGJhc2ljIEVEQQpzdW1tYXJ5KGRpc3QxKQpzdHIoZGlzdDEpCiMgYWRkIHRvdGFsIGNhc2VzL2RlYXRocyBieSBjb3VudHkgYW5kIG1hcApzdHIodG90YWxfY2FzZXMpCnRvdGFsX2Nhc2VzJGNvdW50eUZJUFMgPC0gdG90YWxfY2FzZXMkY291bnR5X2ZpcHMKZGF0YSA8LSBsZWZ0X2pvaW4oZGlzdDEsIHRvdGFsX2Nhc2VzLCBieSA9ICJGSVBTIikKc3RyKGRhdGEpCmRhdGEgPC0gZGF0YVssIGMoMSwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTUpXQpoZWFkKGRhdGEpCnN0cih0b3RhbF9kZWF0aHMpCnRvdGFsX2RlYXRocyA8LSB0b3RhbF9kZWF0aHNbLCBjKDEsIDQpXQpkYXRhIDwtIGxlZnRfam9pbihkYXRhLCB0b3RhbF9kZWF0aHMsIGJ5ID0gIkZJUFMiKQpzdHIoZGF0YSkKCiMgRURBIG9uIGRhdGEKc3VtbWFyeShkYXRhKQpmcmVxKGRhdGEpCnBsb3RfbnVtKGRhdGEpCmhpc3QoZGF0YSRtaV90b19jb3VudHkpCmhpc3QoZGF0YSRkaXN0X2NhdCkgIyBjYXRlZ29yaWVzICA9IDEgKDBtaSksIDIgKDwgMjUpLCAzICg8IDc1KSwgNCAoPCAxNTApLCA1ICg8IDMwMCksIDYgKDMwMCArKQpwbG90KGRhdGEkdG90YWxfY2FzZXMsIGRhdGEkdG90YWxfZGVhdGhzKQpwbG90KGRhdGEkdG90YWxfY2FzZXMsIGRhdGEkcG9wdWxhdGlvbikKZ2dwbG90KGRhdGEsIGFlcyh4ID0gdG90YWxfY2FzZXMsIHkgPSB0b3RhbF9kZWF0aHMsIGNvbG9yID0gZGlzdF9jYXQpKSArCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IG1lYXRfcGxhbnQpKQoKI2xvYWQgZmlsZSB3aXRoIHNlbGVjdGVkIGNvdW50aWVzIGFuZCByZXBlYXQgcHJvY2VzcwpoZWFkKGRpc3QyLCAxMCkKIyBwZXJmb3JtIGJhc2ljIEVEQQpzdW1tYXJ5KGRpc3QyKQpzdHIoZGlzdDIpCmRpc3QyIDwtIGRpc3QyICU+JSBmaWx0ZXIoc2VsZWN0ID09ICJZIikKIyBhZGQgdG90YWwgY2FzZXMvZGVhdGhzIGJ5IGNvdW50eSBhbmQgbWFwCmRhdGEyPC0gbGVmdF9qb2luKGRpc3QyLCB0b3RhbF9jYXNlcywgYnkgPSAiRklQUyIpCnN0cihkYXRhMikKZGF0YTIgPC0gZGF0YTJbLCBjKDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUpXQpoZWFkKGRhdGEyKQoKIyBFREEgb24gZGF0YTIKc3VtbWFyeShkYXRhMikKc3RyKGRhdGEyKQpwbG90X251bShkYXRhMikKaGlzdChkYXRhMiRkaXN0X2Zyb21fbWF4cG9wKQpoaXN0KGRhdGEyJGRpc3RfY2F0KSAjIGNhdGVnb3JpZXMgID0gMSAoMG1pKSwgMiAoPCAyNSksIDMgKDwgNzUpLCA0ICg8IDE1MCksIDUgKDwgMzAwKSwgNiAoMzAwICspCnBsb3QoZGF0YTIkY2FzZXMsIGRhdGEyJHBvcHVsYXRpb24pCnBsb3QoZGF0YTIkZGVhdGhzLCBkYXRhMiRjYXNlcykKZ2dwbG90KGRhdGEyLCBhZXMoeCA9IGNhc2VzLCB5ID0gZGVhdGhzLCBjb2xvciA9IGRpc3RfZnJvbV9tYXhwb3ApKSArCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IG1lYXRfcGxhbnQpKQojIG1hcCB1c2luZyB1cmJubWFwcgojIGh0dHBzOi8vbWVkaXVtLmNvbS9AdXJiYW5faW5zdGl0dXRlL2hvdy10by1jcmVhdGUtc3RhdGUtYW5kLWNvdW50eS1tYXBzLWVhc2lseS1pbi1yLTU3N2QyOTMwMGJiMgpoZWFkKHN0YXRlcykgIyB1cmJubWFwciBkYXRhc2V0CmNvdW50aWVzIDwtIGdldF91cmJuX21hcCgiY291bnRpZXMiLCBzZiA9IFRSVUUpCmNvdW50aWVzJEZJUFMgPC0gYXMuaW50ZWdlcihjb3VudGllcyRjb3VudHlfZmlwcykKaGVhZChjb3VudGllcykKc3RyKGNvdW50aWVzKQpzcGF0aWFsX2RhdGEgPC0gbWVyZ2UoY291bnRpZXMsIGRhdGEsIGJ5ID0gIkZJUFMiKQpoZWFkKHNwYXRpYWxfZGF0YSkKc3BhdGlhbF9kYXRhMiA8LSBtZXJnZShjb3VudGllcywgZGlzdDIsIGJ5ID0gIkZJUFMiKQojIGh0dHBzOi8vbWdpbW9uZC5naXRodWIuaW8vRVMyMTgvV2VlazEyYS5odG1sCiMgaHR0cHM6Ly9tZ2ltb25kLmdpdGh1Yi5pby9TcGF0aWFsL21hcHBpbmctZGF0YS1pbi1yLmh0bWwKZ2dwbG90KHNwYXRpYWxfZGF0YSkgKyBnZW9tX3NmKGFlcyhmaWxsID0gbWlfdG9fY291bnR5KSkKZ2dwbG90KHNwYXRpYWxfZGF0YSkgKyBnZW9tX3NmKGFlcyhmaWxsID0gZGlzdF9jYXQpKQpnZ3Bsb3Qoc3BhdGlhbF9kYXRhKSArIGdlb21fc2YoYWVzKGZpbGwgPSAtdG90YWxfY2FzZXMpKQpnZ3Bsb3Qoc3BhdGlhbF9kYXRhKSArIGdlb21fc2YoYWVzKGZpbGwgPSAtdG90YWxfZGVhdGhzKSkKc3BhdGlhbF9kYXRhX01OIDwtIHNwYXRpYWxfZGF0YSAlPiUgZmlsdGVyKHN0YXRlX2FiYnYgPT0gIk1OIikKZ2dwbG90KHNwYXRpYWxfZGF0YV9NTikgKyBnZW9tX3NmKGFlcyhmaWxsID0gbWlfdG9fY291bnR5KSkKZ2dwbG90KHNwYXRpYWxfZGF0YV9NTikgKyBnZW9tX3NmKGFlcyhmaWxsID0gZGlzdF9jYXQpKQpnZ3Bsb3Qoc3BhdGlhbF9kYXRhX01OKSArIGdlb21fc2YoYWVzKGZpbGwgPSAtdG90YWxfY2FzZXMpKQpnZ3Bsb3Qoc3BhdGlhbF9kYXRhX01OKSArIGdlb21fc2YoYWVzKGZpbGwgPSAtdG90YWxfZGVhdGhzKSkKCiMgdXNlIHRtYXAgcGFja2FnZQojIGh0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTgvMTAvMDIvY3JlYXRpbmctYmVhdXRpZnVsLWRlbW9ncmFwaGljLW1hcHMtaW4tci13aXRoLXRoZS10aWR5Y2Vuc3VzLWFuZC10bWFwLXBhY2thZ2VzLwojIGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy90bWFwL3RtYXAucGRmCmN1dHMgPC0gYygwLCAyNSwgNzUsIDE1MCwgMzAwLCAxNDAwKQojIHBhbGV0dGVfZXhwbG9yZXIoKQojIERpc3RhbmNlIG1hcHMgb2YgVVMgY291bnRpZXMKdG1fc2hhcGUoc3BhdGlhbF9kYXRhLCBwcm9qZWN0aW9ucyA9IDIxNjMpICsKICB0bV9wb2x5Z29ucyhjb2wgPSAibWlfdG9fY291bnR5IiwgYnJlYWtzID0gY3V0cywgcGFsZXR0ZSA9ICItQnVQdSIpICsKICB0bV9sYXlvdXQodGl0bGUgPSAiRGlzdGFuY2UgdG8gU3RhdGUgUG9wdWxhdGlvbiBDZW50ZXIiLAogICAgICAgICAgICB0aXRsZS5zaXplID0gMS4xLAogICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9IGMoImNlbnRlciIsICJ0b3AiKSkKcGxhbnRzIDwtIHNwYXRpYWxfZGF0YSAlPiUgZmlsdGVyKG1lYXRfcGxhbnQgPT0gIjEiKSAjIGFkZCBjb3VudGllcyB3L21lYXQgcGxhbnRzCnRtX3NoYXBlKHNwYXRpYWxfZGF0YSwgcHJvamVjdGlvbnMgPSAyMTYzKSArCiAgdG1fcG9seWdvbnMoY29sID0gIm1pX3RvX2NvdW50eSIsIGJyZWFrcyA9IGN1dHMsIHBhbGV0dGUgPSAiLUJ1UHUiKSArCiAgdG1fc2hhcGUocGxhbnRzLCBwcm9qZWN0aW9ucyA9IDIxNjMpICsKICB0bV9wb2x5Z29ucyhjb2wgPSAibWVhdF9wbGFudCIsIHBhbGV0dGUgPSAiT3JhbmdlcyIpICsKICB0bV9sYXlvdXQodGl0bGUgPSAiRGlzdCB0byBTdGF0ZSBQb3AgQ2VudGVyLCBDb3VudGllcyB3aXRoIE1lYXQgUGxhbnRzIiwKICAgICAgICAgICAgdGl0bGUuc2l6ZSA9IDEuMSwKICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSBjKCJjZW50ZXIiLCAidG9wIikpCiMgQ09WSUQgbWFwcyBvZiBVUyBjb3VudGllcwp0bV9zaGFwZShzcGF0aWFsX2RhdGEsIHByb2plY3Rpb25zID0gMjE2MykgKwogIHRtX3BvbHlnb25zKGNvbCA9ICJ0b3RhbF9jYXNlcyIsIHN0eWxlID0gInF1YW50aWxlIiwgcGFsZXR0ZSA9ICJPclJkIikgKwogIHRtX2xheW91dCh0aXRsZSA9ICJUb3RhbCBDT1ZJRCBjYXNlcyBieSBDb3VudHkiLAogICAgICAgICAgICB0aXRsZS5zaXplID0gMS4xLAogICAgICAgICAgICB0aXRsZS5wb3NpdGlvbiA9IGMoImNlbnRlciIsICJ0b3AiKSkKdG1fc2hhcGUoc3BhdGlhbF9kYXRhLCBwcm9qZWN0aW9ucyA9IDIxNjMpICsKICB0bV9wb2x5Z29ucyhjb2wgPSAidG90YWxfZGVhdGhzIiwgc3R5bGUgPSAibG9nMTBfcHJldHR5IiwgcGFsZXR0ZSA9ICJPclJkIikgKwogIHRtX2xheW91dCh0aXRsZSA9ICJUb3RhbCBDT1ZJRCBkZWF0aHMgYnkgQ291bnR5IiwKICAgICAgICAgICAgdGl0bGUuc2l6ZSA9IDEuMSwKICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSBjKCJjZW50ZXIiLCAidG9wIikpCiMgRGlzdGFuY2UgbWFwcyBvZiBNTiBjb3VudGllcwpNTm1hcCA8LSB0bV9zaGFwZShzcGF0aWFsX2RhdGFfTU4sIHByb2plY3Rpb24gPSAyMTYzKSArIAogIHRtX3BvbHlnb25zKGNvbCA9ICJtaV90b19jb3VudHkiLCBzdHlsZSA9ICJxdWFudGlsZSIsIHBhbGV0dGUgPSAiLVlsR25CdSIpICsgCiAgdG1fbGVnZW5kKHBvc2l0aW9uID0gYygicmlnaHQiLCAiY2VudGVyIikpICsKICB0bV9sYXlvdXQodGl0bGUgPSAiTWlubmVzb3RhIENvdW50aWVzLFxuRGlzdCB0byBUd2luIENpdGllcyIsCiAgICAgICAgICAgIHRpdGxlLnNpemUgPSAxLjEsCiAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gYygiY2VudGVyIiwgInRvcCIpKQpNTm1hcApNTm1hcCArIHRtX3NoYXBlKHBsYW50cywgcHJvamVjdGlvbiA9IDIxNjMpICsKICB0bV9wb2x5Z29ucyhjb2wgPSAibWVhdF9wbGFudCIsIHBhbGV0dGUgPSAiT3JhbmdlcyIpCiMgQ09WSUQgbWFwcyBvZiBNTiBjb3VudGllcwpNTm1hcENPVklEIDwtIHRtX3NoYXBlKHNwYXRpYWxfZGF0YV9NTiwgcHJvamVjdGlvbiA9IDIxNjMpICsgCiAgdG1fcG9seWdvbnMoYygidG90YWxfY2FzZXMiLCAidG90YWxfZGVhdGhzIiksIHN0eWxlID0gYygicXVhbnRpbGUiLCAicHJldHR5IiksIAogICAgICAgICAgICAgIHBhbGV0dGUgPSBsaXN0KCJZbEduQnUiLCAiWWxPclJkIikpICsgCiAgdG1fbGVnZW5kKHBvc2l0aW9uID0gYygicmlnaHQiLCAiY2VudGVyIikpICsKICB0bV9sYXlvdXQodGl0bGUgPSAiIE1OIENvdW50aWVzLCBDT1ZJRCBEYXRhIiwKICAgICAgICAgICAgdGl0bGUuc2l6ZSA9IDEuMSwKICAgICAgICAgICAgdGl0bGUucG9zaXRpb24gPSBjKCJjZW50ZXIiLCAidG9wIikpCk1ObWFwQ09WSUQKCmBgYApJSUkuIENvdW50cnkgbGV2ZWwgdGltZSBzZXJpZXMgYW5hbHlzaXMKICBBLiBGaWx0ZXIgZGF0YSB0byA2IGtleSBjb3VudHJpZXMgKFVTLCBDaGluYSwgVUssIFR1cmtleSwgQnJhemlsLCBJbmRpYSkgCiAgQi4gV29yayB0aHJvdWdoIHZhcmlvdXMgdGltZSBzZXJpZXMgbW9kZWxzIGZvciBVUwogIEMuIENob29zZSBiZXN0IHRzIG1vZGVsIChBUklNQSkgYW5kIHR1bmUKICBELiBSZXBsaWNhdGUgbW9kZWxzIGZvciBvdGhlciBjb3VudHJpZXMKICBFLiBGb3JlY2FzdCAxMCBkYXlzIG91dApgYGB7cn0KIyBodHRwczovL3d3dy5vdGV4dHMub3JnL2ZwcDIKIyBEYXRhQ2FtcCBjb3Vyc2Ugb24gQVJJTUEgd2l0aCBSCiMgdXNlIHdvcmsgZmxvdyBAIGh0dHBzOi8vZGF0YXNjaWVuY2VwbHVzLmNvbS90aW1lLXNlcmllcy1hbmFseXNpcy11c2luZy1hcmltYS1tb2RlbC1pbi1yLwoKIyBmaWx0ZXIgdG8gVVMgdG90YWxzIG9ubHkgKHJlbW92ZSBzdGF0ZSkKdHJhaW5fVVMgPC0gdHJhaW4gJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiVVMiKSAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICIiKQpoZWFkKHRyYWluX1VTKQp0YWlsKHRyYWluX1VTKQojIGNvbnZlcnQgZGF0YXNldCB0byB0aW1lIHNlcmllcyBhbmQgcGxvdAp0c1VTIDwtIHRzKHRyYWluX1VTWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQpzdHIodHNVUykKYXV0b3Bsb3QodHNVUykKIyByZXBlYXQgZm9yIENoaW5hCnRyYWluX0NoaW5hIDwtIHRyYWluICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkNoaW5hIikgJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiIikKdGFpbCh0cmFpbl9DaGluYSkKdHNDaGluYSA8LSB0cyh0cmFpbl9DaGluYVssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNDaGluYSkKIyByZXBlYXQgZm9yIFR1cmtleQp0cmFpbl9UdXJrZXkgPC0gdHJhaW4gJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiVHVya2V5IikKaGVhZCh0cmFpbl9UdXJrZXkpCnN0cih0cmFpbl9UdXJrZXkpCnRzVHVya2V5IDwtIHRzKHRyYWluX1R1cmtleVssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKc3RyKHRzVHVya2V5KQphdXRvcGxvdCh0c1R1cmtleSkKIyByZXBlYXQgZm9yIFVuaXRlZCBLaW5nZG9tCnRyYWluX1VLIDwtIHRyYWluICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBLaW5nZG9tIikgJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiIikKdGFpbCh0cmFpbl9VSykKdHNVSyA8LSB0cyh0cmFpbl9VS1ssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNVSykKIyByZXBlYXQgZm9yIEluZGlhCnRyYWluX0luZGlhIDwtIHRyYWluICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkluZGlhIikgJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiIikKdGFpbCh0cmFpbl9JbmRpYSkKdHNJbmRpYSA8LSB0cyh0cmFpbl9JbmRpYVssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNJbmRpYSkKIyByZXBlYXQgZm9yIEJyYXppbAp0cmFpbl9CcmF6aWwgPC0gdHJhaW4gJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiQnJhemlsIikgJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiIikKdGFpbCh0cmFpbl9CcmF6aWwpCnRzQnJhemlsIDwtIHRzKHRyYWluX0JyYXppbFssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNCcmF6aWwpCgojIGZpbHRlciB0c1VTIGRhdGEKY2FzZXNVUyA8LSB0c1VTWywgIkNhc2VzIl0KY2FzZXNfdHJhaW4gPC0gY2FzZXNVUyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKY2FzZXNfdGVzdCA8LSBjYXNlc1VTICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpkZWF0aHNVUyA8LSB0c1VTWywgIkRlYXRocyJdCmRlYXRoc190cmFpbiA8LSBkZWF0aHNVUyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKZGVhdGhzX3Rlc3QgPC0gZGVhdGhzVVMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCiMgaW52ZXN0aWdhdGUgYXV0b2NvcnJlbGF0aW9uIG9mIFVTIGRhdGEgKGNoZWNrIGZvciB0cmVuZCwgc2Vhb25hbGl0eSwgY3ljbGljaXR5KQpnZ2xhZ3Bsb3QoY2FzZXNVUykKZ2dBY2YoY2FzZXNVUykgIyByYW5kb20gd2FsayB3aXRoIHRyZW5kLCBuZWVkIHRvIGRpZmZlcmVuY2UgZGF0YQphY2YoY2FzZXNVUywgcGxvdCA9IEZBTFNFKQpnZ1BhY2YoY2FzZXNVUykKUGFjZihjYXNlc1VTLCBwbG90ID0gRkFMU0UpCkJveC50ZXN0KGNhc2VzVVMsIGxhZyA9IDcsIGZpdGRmID0gMCwgdHlwZSA9ICJMaiIpICMgcCB2YWx1ZSBpcyBzbWFsbCwgc2lnbmlmaWNhbnQKYWRmLnRlc3QoY2FzZXNVUykgIyBub24tc3RhdGlvbmFyeQpnZ2xhZ3Bsb3QoZGVhdGhzVVMpCmdnQWNmKGRlYXRoc1VTKSAjIHNhbWUgYXMgYWJvdmUgLSBuZWVkIHRvIGRpZmZlcmVuY2UgZGF0YQphY2YoZGVhdGhzVVMsIHBsb3QgPSBGQUxTRSkKZ2dQYWNmKGRlYXRoc1VTKQpQYWNmKGRlYXRoc1VTLCBwbG90ID0gRkFMU0UpCkJveC50ZXN0KGRlYXRoc1VTLCBsYWcgPSA3LCBmaXRkZiA9IDAsIHR5cGUgPSAiTGoiKSAjIGFsc28gc2lnbmlmaWNhbnQKYWRmLnRlc3QoZGVhdGhzVVMpICMgbm9uLXN0YXRpb25hcnkKIyB0cmFuc2Zvcm1hdGlvbnMgLSBkaWZmIHdpbGwgaGVscCB3aXRoIHRyZW5kCmRpZmZfY2FzZXNVUyA8LSBkaWZmKGNhc2VzVVMpICMgcmVtb3ZlIHRyZW5kCmFkZi50ZXN0KGRpZmZfY2FzZXNVUykgIyBzdGF0aW9uYXJ5CnBhcihtZnJvdyA9IGMoMiwgMSkpCmFjZihkaWZmX2Nhc2VzVVMpCnBhY2YoZGlmZl9jYXNlc1VTKQphY2YoZGlmZihkaWZmX2Nhc2VzVVMpKSAjYmV0dGVyIC0gZG8gd2UgbmVlZCBhIGRvdWJsZSBkaWZmPwpwYWNmKGRpZmYoZGlmZl9jYXNlc1VTKSkgIyB0b28gbXVjaCAtIHN0aWNrIHdpdGggc2luZ2xlIGRpZmYKbmRpZmZzKGNhc2VzVVMpICMgMSBkaWZmZXJlbmNlCm5zZGlmZnMoY2FzZXNVUykgIyAwIHNlYXNvbmFsIGRpZmZlcmVuY2VzCkJveC50ZXN0KGRpZmZfY2FzZXNVUywgbGFnID0gNywgZml0ZGYgPSAwLCB0eXBlID0gIkxqIikgIyBzaWduaWZpY2FudApkaWZmX2RlYXRoc1VTIDwtIGRpZmYoZGVhdGhzVVMpICMgcmVtb3ZlIHRyZW5kCmFkZi50ZXN0KGRpZmZfZGVhdGhzVVMpICMgc3RhdGlvbmFyeQpuZGlmZnMoZGVhdGhzVVMpICMgMSBkaWZmZXJlbmNlCm5zZGlmZnMoZGVhdGhzVVMpICMgMCBkaWZmCnBhcihtZnJvdyA9IGMoMSwgMSkpCgojIFBvc3NpYmxlIG1vZGVscyBmb3IgQ0FTRVMgCiMgc2ltcGxlIGV4cG9uZW50aWFsIHNtb290aGluZyAoU0VTKQpmY19zZXMgPC0gc2VzKGNhc2VzVVMpCmZjX3NlcyRtb2RlbCAjIEFJQyAtIDIxNzAuMTg2LCBCSUMgLSAyMTc4LjIzMiAKZmNkX3NlcyA8LSBzZXMoZGlmZl9jYXNlc1VTKQpmY2Rfc2VzJG1vZGVsICMgQUlDIC0gMjE0OC44NDcsIEJJQyAtIDIxNTYuODY1CmZjZF9zZXMyIDwtIHNlcyhkaWZmKGNhc2VzX3RyYWluKSwgaCA9IDIwKQpjaGVja3Jlc2lkdWFscygoZmNkX3NlczIpKSAjIGRvZXMgbm90IHBhc3MgTGp1bmcgQm94IHRlc3QgKHJlc2lkdWFscykKYXV0b3Bsb3QoZmNkX3NlczIsIHNlcmllcyA9ICJTRVMgb24gZGlmZmVyZW5jZWQgZGF0YSIpICsKICBhdXRvbGF5ZXIoZGlmZihjYXNlc190ZXN0KSwgc2VyaWVzID0gIkFjdHVhbCBkaWZmZXJlbmNlZCBkYXRhIikKIyB0cmVuZCBtb2RlbHMKZmNfaG9sdCA8LSBob2x0KGNhc2VzVVMpIApmY19ob2x0JG1vZGVsICMgQUlDIC0gMjE3NC4xNDIsIEJJQyAtIDIxODcuNTUyIApmY2RfaG9sdCA8LSBob2x0KGRpZmZfY2FzZXNVUykKZmNkX2hvbHQkbW9kZWwgIyBkaWZmZXJlbmNlZCwgQUlDIC0gMjE1My40NTAsIEJJQyAtIDIxNjYuODE1CmZjZF9ob2x0X2RhbXAgPC0gaG9sdChkaWZmX2Nhc2VzVVMsIGRhbXBlZCA9IFRSVUUpCmZjZF9ob2x0X2RhbXAkbW9kZWwgIyBkaWZmIGFuZCBkYW1wZWQsIEFJQyAtIDIxNTUuODI2LCBCSUMgLSAyMTcxLjg2MwpmY2RfaG9sdDIgPC0gaG9sdChkaWZmKGNhc2VzX3RyYWluKSwgaCA9IDIwKQpjaGVja3Jlc2lkdWFscyhmY2RfaG9sdDIpCmF1dG9wbG90KGZjZF9ob2x0Miwgc2VyaWVzID0gIkhvbHQncyBtZXRob2Qgb24gZGlmZmVyZW5jZWQgZGF0YSIpICsKICBhdXRvbGF5ZXIoZGlmZihjYXNlc190ZXN0KSwgc2VyaWVzID0gIkFjdHVhbCBkaWZmZXJlbmNlZCBkYXRhIikKIyBtdWx0aXBsZSByZWdyZXNzaW9uIG1vZGVscwojIEFSSU1BCmZpdF9jYXNlcyA8LSBhdXRvLmFyaW1hKGNhc2VzVVMpCmZpdF9jYXNlcyAjIEFSSU1BKDAsIDEsIDApLCBSQU5ET00gV0FMSywgQUlDIC0gMTk0OS44MSwgQklDIC0gMTk1Mi40OApmaXRfY2FzZXMyIDwtIGF1dG8uYXJpbWEoY2FzZXNVUywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfY2FzZXMyICMgQVJJTUEoMywgMSwgMCksIEFJQyAtIDE5NDEuMTYsIEJJQyAtIDE5NTEuODUKYXV0b3Bsb3QoZml0X2Nhc2VzMikKc2FyaW1hLmZvcihjYXNlc190cmFpbiwgbi5haGVhZCA9IDIwLCAzLCAxLCAwKQpsaW5lcyhjYXNlc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfY2FzZXMyKQojIENvbXBhcmUgYWNjdXJhY3kgb2YgQ0FTRVMgbW9kZWxzCmFjY3VyYWN5KGZjZF9zZXMyKQphY2N1cmFjeShmY2RfaG9sdDIpCmFjY3VyYWN5KGZpdF9jYXNlczIpICMgbW9zdCBhY2N1cmF0ZSBwbHVzIGJlc3QgQUlDL0JJQwoKIyBQb3NzaWJsZSBtb2RlbHMgZm9yIERFQVRIUwojIHNpbXBsZSBleHBvbmVudGlhbCBzbW9vdGhpbmcgKFNFUykKZmMyX3NlcyA8LSBzZXMoZGVhdGhzVVMpCmZjMl9zZXMkbW9kZWwgIyBBSUMgLSAxODExLjQzOSwgQklDIC0gMTgxOS40ODYKZmNkMl9zZXMgPC0gc2VzKGRpZmZfZGVhdGhzVVMpCmZjZDJfc2VzJG1vZGVsICMgQUlDIC0gMTc5NS41MjIsIEJJQyAtIDE4MDMuNTQwCmZjZDJfc2VzMiA8LSBzZXMoZGlmZihkZWF0aHNfdHJhaW4pLCBoID0gMjApCmNoZWNrcmVzaWR1YWxzKGZjZDJfc2VzMikKYXV0b3Bsb3QoZmNkMl9zZXMyLCBzZXJpZXMgPSAiU0VTIG9uIGRpZmZlcmVuY2VkIGRhdGEiKSArCiAgYXV0b2xheWVyKGRpZmYoZGVhdGhzX3Rlc3QpLCBzZXJpZXMgPSAiQWN0dWFsIGRpZmZlcmVuY2VkIGRhdGEiKQojIHRyZW5kIG1vZGVscwpmYzJfaG9sdCA8LSBob2x0KGRlYXRoc1VTKSAKZmMyX2hvbHQkbW9kZWwgIyBBSUMgLSAxODE1LjQ0MSwgQklDIC0gMTgyOC44NTIgCmZjZDJfaG9sdCA8LSBob2x0KGRpZmZfZGVhdGhzVVMpCmZjZDJfaG9sdCRtb2RlbCAjIGRpZmZlcmVuY2VkLCBBSUMgLSAxNzk5LjY4MSwgQklDIC0gMTgxMy4wNDUKZmNkMl9ob2x0X2RhbXAgPC0gaG9sdChkaWZmX2RlYXRoc1VTLCBkYW1wZWQgPSBUUlVFKQpmY2QyX2hvbHRfZGFtcCRtb2RlbCAjIGRhbXBlZCwgQUlDIC0gMTgwMS41MzEsIEJJQyAtIDE4MTcuNTY4CmZjZDJfaG9sdF9kYW1wMiA8LSBob2x0KGRpZmYoZGVhdGhzX3RyYWluKSwgZGFtcGVkID0gVFJVRSwgaCA9IDIwKQpjaGVja3Jlc2lkdWFscyhmY2QyX2hvbHQpCmF1dG9wbG90KGZjZDJfaG9sdCwgc2VyaWVzID0gIkhvbHQncyBtZXRob2Qgb24gZGlmZmVyZW5jZWQgZGF0YSIpICsKICBhdXRvbGF5ZXIoZGlmZihjYXNlc190ZXN0KSwgc2VyaWVzID0gIkFjdHVhbCBkaWZmZXJlbmNlZCBkYXRhIikKIyBtdWx0aXBsZSByZWdyZXNzaW9uIG1vZGVscwojIEFSSU1BCmZpdF9kZWF0aHMgPC0gYXV0by5hcmltYShkZWF0aHNVUykKZml0X2RlYXRocyAjIEFSSU1BKDMsIDEsIDIpLCBBSUMgLSAxNTYwLjUsIEJJQyAtIDE1NzYuNTQKZml0X2RlYXRoczIgPC0gYXV0by5hcmltYShkZWF0aHNVUywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfZGVhdGhzMiAjIEFSSU1BKDMsIDEsIDIpLCBzYW1lIGFzIGFib3ZlCmF1dG9wbG90KGZpdF9kZWF0aHMyKQpzYXJpbWEuZm9yKGRlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCAzLCAxLCAwKQpsaW5lcyhkZWF0aHNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X2RlYXRoczIpCiMgQ29tcGFyZSBhY2N1cmFjeSBvZiBERUFUSFMgbW9kZWxzCmFjY3VyYWN5KGZjZDJfc2VzMikKYWNjdXJhY3koZmNkMl9ob2x0KQphY2N1cmFjeShmaXRfZGVhdGhzMikgIyBtb3N0IGFjY3VyYXRlIHBsdXMgYmVzdCBBSUMvQklDCiMgVHVuZSB0aGUgbW9kZWwKIyBSZWdyZXNzaW9uIHdpdGggQVJJTUEgZXJyb3JzIGluIFIKY2FzZXNfZXJyb3JzIDwtIGF1dG8uYXJpbWEoY2FzZXNVUywgeHJlZyA9IGRlYXRoc1VTLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmNhc2VzX2Vycm9ycyAjIEFSSU1BKDAsIDEsIDUpIEFJQyAtIDE5MzYuOTUsIEJJQyAtIDE5NTUuNjYKY2hlY2tyZXNpZHVhbHMoY2FzZXNfZXJyb3JzKQpmY19lcnJvcnMgPC0gZm9yZWNhc3QoY2FzZXNfZXJyb3JzLCB4cmVnID0gcmVwKG1lYW4oZGVhdGhzVVMpKSwgMjApCmF1dG9wbG90KGZjX2Vycm9ycykKIyBjb21wYXJlIHRvIG1vc3QgYWNjdXJhdGUgQ0FTRVMgbW9kZWwKYWNjdXJhY3koZmNfZXJyb3JzKSAjIGJldHRlciBtb2RlbAphY2N1cmFjeShmaXRfY2FzZXMyKQpkZWF0aHNfZXJyb3JzIDwtIGF1dG8uYXJpbWEoZGVhdGhzVVMsIHhyZWcgPSBjYXNlc1VTLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmRlYXRoc19lcnJvcnMgIyBBUklNQSgwLCAwLCA1KSBBSUMgLSAxNTg1LjcyLCBCSUMgLSAxNjA0LjQ5CmNoZWNrcmVzaWR1YWxzKGRlYXRoc19lcnJvcnMpCmZjMl9lcnJvcnMgPC0gZm9yZWNhc3QoZGVhdGhzX2Vycm9ycywgeHJlZyA9IHJlcChtZWFuKGNhc2VzVVMpLCAyMCkpCmF1dG9wbG90KGZjMl9lcnJvcnMpCiMgY29tcGFyZSB0byBtb3N0IGFjY3VyYXRlIERFQVRIUyBtb2RlbAphY2N1cmFjeShmYzJfZXJyb3JzKSAKYWNjdXJhY3koZml0X2RlYXRoczIpICMgYmV0dGVyIG1vZGVsCgojIEZpbmFsIG1vZGVscyBmb3IgVVMKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTLCBESUZGRVJFTkNFRCBEQVRBIFNFVFMKY2FzZXNVUyA8LSB0c1VTWywgIkNhc2VzIl0KY2FzZXNVU190cmFpbiA8LSBjYXNlc1VTICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpjYXNlc1VTX3Rlc3QgPC0gY2FzZXNVUyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKZGlmZl9jYXNlc1VTIDwtIGRpZmYoY2FzZXNVUykKZGVhdGhzVVMgPC0gdHNVU1ssICJEZWF0aHMiXQpkZWF0aHNVU190cmFpbiA8LSBkZWF0aHNVUyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKZGVhdGhzVVNfdGVzdCA8LSBkZWF0aHNVUyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKZGlmZl9kZWF0aHNVUyA8LSBkaWZmKGRlYXRoc1VTKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfY2FzZXNVUyA8LSBhdXRvLmFyaW1hKGNhc2VzVVMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSwgdHJhY2UgPSBUUlVFKQpmaXRfY2FzZXNVUyAjIEFSSU1BKDMsIDEsIDApLCBBSUNjIC0gMTk0MS41NQphdXRvcGxvdChmaXRfY2FzZXNVUykKYWNjdXJhY3koZml0X2Nhc2VzVVMpCnNhcmltYS5mb3IoY2FzZXNVU190cmFpbiwgbi5haGVhZCA9IDIwLCAzLCAxLCAwKQpsaW5lcyhjYXNlc1VTX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9jYXNlc1VTKSAjIHAtdmFsdWUgdG9vIGxvdwpmaXRfY2FzZXNVUzIgPC0gYXJpbWEoY2FzZXNVUywgb3JkZXIgPSBjKDYsIDEsIDIpKQpjaGVja3Jlc2lkdWFscyhmaXRfY2FzZXNVUzIpICMgcGFzc2VzIExqdW5nLUJveCB0ZXN0CmZpdF9jYXNlc1VTMgphY2N1cmFjeShmaXRfY2FzZXNVUzIpCmZpdF9kZWF0aHNVUyA8LSBhdXRvLmFyaW1hKGRlYXRoc1VTLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9kZWF0aHNVUyAjIEFSSU1BKDQsIDEsIDApLCBBSUNjIC0gMTE1NS40MQphdXRvcGxvdChmaXRfZGVhdGhzVVMpCmFjY3VyYWN5KGZpdF9kZWF0aHNVUykKc2FyaW1hLmZvcihkZWF0aHNVU190cmFpbiwgbi5haGVhZCA9IDIwLCA0LCAxLCAwKQpsaW5lcyhkZWF0aHNVU190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfZGVhdGhzVVMpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfVVMgPC0gc2FyaW1hLmZvcihjYXNlc1VTLCBuLmFoZWFkID0gMTAsIDYsIDEsIDIpCmZjXzEwX1VTJHByZWQKZmNkXzEwX1VTIDwtIHNhcmltYS5mb3IoZGVhdGhzVVMsIG4uYWhlYWQgPSAxMCwgNCwgMSwgMCkgCmZjZF8xMF9VUyRwcmVkCiMgbW9kZWxzIHNob3cgY2FzZXMgZGVjbGluaW5nIHdoaWxlIGRlYXRocyBhcmUgc3RlYWR5CgojIFJlcGVhdCBmb3IgQnJhemlsCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUywgRElGRkVSRU5DRUQgREFUQSBTRVRTCmNhc2VzQnJhemlsIDwtIHRzQnJhemlsWywgIkNhc2VzIl0KY2FzZXNCcmF6aWxfdHJhaW4gPC0gY2FzZXNCcmF6aWwgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCmNhc2VzQnJhemlsX3Rlc3QgPC0gY2FzZXNCcmF6aWwgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCmRpZmZfY2FzZXNCcmF6aWwgPC0gZGlmZihjYXNlc0JyYXppbCkKZGVhdGhzQnJhemlsIDwtIHRzQnJhemlsWywgIkRlYXRocyJdCmRlYXRoc0JyYXppbF90cmFpbiA8LSBkZWF0aHNCcmF6aWwgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCmRlYXRoc0JyYXppbF90ZXN0IDwtIGRlYXRoc0JyYXppbCAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKZGlmZl9kZWF0aHNCcmF6aWwgPC0gZGlmZihkZWF0aHNCcmF6aWwpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9jYXNlc0JyYXppbCA8LSBhdXRvLmFyaW1hKGNhc2VzQnJhemlsLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9jYXNlc0JyYXppbCAjIEFSSU1BKDMsIDEsIDIpLCBBSUNjIC0gMTY4MC40CmF1dG9wbG90KGZpdF9jYXNlc0JyYXppbCkKc2FyaW1hLmZvcihjYXNlc0JyYXppbF90cmFpbiwgbi5haGVhZCA9IDIwLCAzLCAxLCAyKQpsaW5lcyhjYXNlc0JyYXppbF90ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfY2FzZXNCcmF6aWwpCmZpdF9jYXNlc0JyYXppbDIgPC0gYXJpbWEoY2FzZXNCcmF6aWwsIG9yZGVyID0gYyg0LCAyLCA0KSkKY2hlY2tyZXNpZHVhbHMoZml0X2Nhc2VzQnJhemlsMikgIyBwYXNzZXMgdGhlIExqdW5nIEJveCB0ZXN0CmZpdF9kZWF0aHNCcmF6aWwgPC0gYXV0by5hcmltYShkZWF0aHNCcmF6aWwsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X2RlYXRoc0JyYXppbCAjIEFSSU1BKDQsIDEsIDApLCBBSUNjIC0gMTE1NS40MQphdXRvcGxvdChmaXRfZGVhdGhzQnJhemlsKQpzYXJpbWEuZm9yKGRlYXRoc0JyYXppbF90cmFpbiwgbi5haGVhZCA9IDIwLCA0LCAxLCAwKQpsaW5lcyhkZWF0aHNCcmF6aWxfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X2RlYXRoc0JyYXppbCkgIyBwYXNzZXMKIyBVc2UgYmVzdCBtb2RlbHMgdG8gZm9yZWNhc3QgZnVydGhlciBhaGVhZApmY18xMF9CcmF6aWwgPC0gc2FyaW1hLmZvcihjYXNlc0JyYXppbCwgbi5haGVhZCA9IDEwLCA0LCAyLCA0KQpmY18xMF9CcmF6aWwkcHJlZApmY2RfMTBfQnJhemlsIDwtIHNhcmltYS5mb3IoZGVhdGhzQnJhemlsLCBuLmFoZWFkID0gMTAsIDQsIDEsIDApIApmY2RfMTBfQnJhemlsJHByZWQKIyBtb2RlbHMgYXJlIGZvbGxvd2luZyB1cHdhcmQgdHJlbmQgYnV0IG1vcmUgY29uc2VydmF0aXZlbHkgdGhhbiByZWNlbnQgc3Bpa2UKCiMgUmVwZWF0IGZvciBDaGluYQojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMsIERJRkZFUkVOQ0VEIERBVEEgU0VUUwpjYXNlc0NoaW5hIDwtIHRzQ2hpbmFbLCAiQ2FzZXMiXQpjYXNlc0NoaW5hX3RyYWluIDwtIGNhc2VzQ2hpbmEgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCmNhc2VzQ2hpbmFfdGVzdCA8LSBjYXNlc0NoaW5hICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpkaWZmX2Nhc2VzQ2hpbmEgPC0gZGlmZihjYXNlc0NoaW5hKQpkZWF0aHNDaGluYSA8LSB0c0NoaW5hWywgIkRlYXRocyJdCmRlYXRoc0NoaW5hX3RyYWluIDwtIGRlYXRoc0NoaW5hICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpkZWF0aHNDaGluYV90ZXN0IDwtIGRlYXRoc0NoaW5hICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpkaWZmX2RlYXRoc0NoaW5hIDwtIGRpZmYoZGVhdGhzQ2hpbmEpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9jYXNlc0NoaW5hIDwtIGF1dG8uYXJpbWEoY2FzZXNDaGluYSwgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfY2FzZXNDaGluYSAjIEFSSU1BKDAsIDEsIDEpLCBBSUNjIC0gMTg3NC42NgphdXRvcGxvdChmaXRfY2FzZXNDaGluYSkKc2FyaW1hLmZvcihjYXNlc0NoaW5hX3RyYWluLCBuLmFoZWFkID0gMjAsIDAsIDEsIDEpCmxpbmVzKGNhc2VzQ2hpbmFfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X2Nhc2VzQ2hpbmEpICMgcGFzc2VzIExqdW5nIEJveCB0ZXN0CmZpdF9kZWF0aHNDaGluYSA8LSBhdXRvLmFyaW1hKGRlYXRoc0NoaW5hLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9kZWF0aHNDaGluYSAjIEFSSU1BKDAsIDAsIDApIFdISVRFIE5PSVNFLEFJQ2MgLSAxMzYxLjI5CiMgQm90aCBtb2RlbHMgYXJlIGZsYXQgKDApIHRvIG1hdGNoIGFjdHVhbHMKCiMgUmVwZWF0IGZvciBJbmRpYQojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMsIERJRkZFUkVOQ0VEIERBVEEgU0VUUwpjYXNlc0luZGlhIDwtIHRzSW5kaWFbLCAiQ2FzZXMiXQpjYXNlc0luZGlhX3RyYWluIDwtIGNhc2VzSW5kaWEgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCmNhc2VzSW5kaWFfdGVzdCA8LSBjYXNlc0luZGlhICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpkaWZmX2Nhc2VzSW5kaWEgPC0gZGlmZihjYXNlc0luZGlhKQpkZWF0aHNJbmRpYSA8LSB0c0luZGlhWywgIkRlYXRocyJdCmRlYXRoc0luZGlhX3RyYWluIDwtIGRlYXRoc0luZGlhICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpkZWF0aHNJbmRpYV90ZXN0IDwtIGRlYXRoc0luZGlhICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpkaWZmX2RlYXRoc0luZGlhIDwtIGRpZmYoZGVhdGhzSW5kaWEpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9jYXNlc0luZGlhIDwtIGF1dG8uYXJpbWEoY2FzZXNJbmRpYSwgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfY2FzZXNJbmRpYSAjIEFSSU1BKDAsIDEsIDIpLCBBSUNjIC0gMTQ3MC43OQphdXRvcGxvdChmaXRfY2FzZXNJbmRpYSkKc2FyaW1hLmZvcihjYXNlc0luZGlhX3RyYWluLCBuLmFoZWFkID0gMjAsIDAsIDEsIDIpCmxpbmVzKGNhc2VzSW5kaWFfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X2Nhc2VzSW5kaWEpICMgcGFzc2VzIHRoZSBManVuZyBCb3ggdGVzdApmaXRfZGVhdGhzSW5kaWEgPC0gYXV0by5hcmltYShkZWF0aHNJbmRpYSwgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfZGVhdGhzSW5kaWEgIyBBUklNQSg0LCAxLCAwKSwgQUlDYyAtIDg0OC45NQphdXRvcGxvdChmaXRfZGVhdGhzSW5kaWEpCnNhcmltYS5mb3IoZGVhdGhzSW5kaWFfdHJhaW4sIG4uYWhlYWQgPSAyMCwgNCwgMSwgMCkKbGluZXMoZGVhdGhzSW5kaWFfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X2RlYXRoc0luZGlhKSAjIHBhc3NlcwojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX0luZGlhIDwtIHNhcmltYS5mb3IoY2FzZXNJbmRpYSwgbi5haGVhZCA9IDEwLCAwLCAxLCAyKQpmY18xMF9JbmRpYSRwcmVkCmZjZF8xMF9JbmRpYSA8LSBzYXJpbWEuZm9yKGRlYXRoc0luZGlhLCBuLmFoZWFkID0gMTAsIDQsIDEsIDApIApmY2RfMTBfSW5kaWEkcHJlZAojIGJvdGggbW9kZWxzIGFyZSBpZ25vcmluZyB0aGUgcmVjZW50IHNwaWtlIGJ1dCB0cmVuZGluZyB1cAoKIyBSZXBlYXQgZm9yIFR1cmtleQojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMsIERJRkZFUkVOQ0VEIERBVEEgU0VUUwpjYXNlc1R1cmtleSA8LSB0c1R1cmtleVssICJDYXNlcyJdCmNhc2VzVHVya2V5X3RyYWluIDwtIGNhc2VzVHVya2V5ICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpjYXNlc1R1cmtleV90ZXN0IDwtIGNhc2VzVHVya2V5ICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpkaWZmX2Nhc2VzVHVya2V5IDwtIGRpZmYoY2FzZXNUdXJrZXkpCmRlYXRoc1R1cmtleSA8LSB0c1R1cmtleVssICJEZWF0aHMiXQpkZWF0aHNUdXJrZXlfdHJhaW4gPC0gZGVhdGhzVHVya2V5ICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpkZWF0aHNUdXJrZXlfdGVzdCA8LSBkZWF0aHNUdXJrZXkgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCmRpZmZfZGVhdGhzVHVya2V5IDwtIGRpZmYoZGVhdGhzVHVya2V5KQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfY2FzZXNUdXJrZXkgPC0gYXV0by5hcmltYShjYXNlc1R1cmtleSwgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfY2FzZXNUdXJrZXkgIyBBUklNQSgxLCAxLCA0KSwgQUlDYyAtIDE1MTguMjIKYXV0b3Bsb3QoZml0X2Nhc2VzVHVya2V5KQpzYXJpbWEuZm9yKGNhc2VzVHVya2V5X3RyYWluLCBuLmFoZWFkID0gMjAsIDEsIDEsIDQpCmxpbmVzKGNhc2VzVHVya2V5X3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9jYXNlc1R1cmtleSkgIyBwYXNzZXMgTGp1bmcgQm94IHRlc3QKZml0X2RlYXRoc1R1cmtleSA8LSBhdXRvLmFyaW1hKGRlYXRoc1R1cmtleSwgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfZGVhdGhzVHVya2V5ICMgQVJJTUEoMSwgMSwgMSksIEFJQ2MgLSA2NDguOTkKYXV0b3Bsb3QoZml0X2RlYXRoc1R1cmtleSkKc2FyaW1hLmZvcihkZWF0aHNUdXJrZXlfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMSwgMSwgMykKbGluZXMoZGVhdGhzVHVya2V5X3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9kZWF0aHNUdXJrZXkpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfVHVya2V5IDwtIHNhcmltYS5mb3IoY2FzZXNUdXJrZXksIG4uYWhlYWQgPSAxMCwgMSwgMSwgNCkKZmNfMTBfVHVya2V5JHByZWQKZmNkXzEwX1R1cmtleSA8LSBzYXJpbWEuZm9yKGRlYXRoc1R1cmtleSwgbi5haGVhZCA9IDEwLCAxLCAxLCAzKSAKZmNkXzEwX1R1cmtleSRwcmVkCiMgbW9kZWxzIGFyZSBmb3JlY2FzdGluZyBkb3dud2FyZCB0cmVuZAoKIyBSZXBlYXQgZm9yIFVLCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUywgRElGRkVSRU5DRUQgREFUQSBTRVRTCmNhc2VzVUsgPC0gdHNVS1ssICJDYXNlcyJdCmNhc2VzVUtfdHJhaW4gPC0gY2FzZXNVSyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKY2FzZXNVS190ZXN0IDwtIGNhc2VzVUsgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCmRpZmZfY2FzZXNVSyA8LSBkaWZmKGNhc2VzVUspCmRlYXRoc1VLIDwtIHRzVUtbLCAiRGVhdGhzIl0KZGVhdGhzVUtfdHJhaW4gPC0gZGVhdGhzVUsgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCmRlYXRoc1VLX3Rlc3QgPC0gZGVhdGhzVUsgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCmRpZmZfZGVhdGhzVUsgPC0gZGlmZihkZWF0aHNVSykKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X2Nhc2VzVUsgPC0gYXV0by5hcmltYShjYXNlc1VLLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9jYXNlc1VLICMgQVJJTUEoMywgMSwgMiksIEFJQ2MgLSAxNzAwLjQKYXV0b3Bsb3QoZml0X2Nhc2VzVUspCnNhcmltYS5mb3IoY2FzZXNVS190cmFpbiwgbi5haGVhZCA9IDIwLCAzLCAxLCAyKQpsaW5lcyhjYXNlc1VLX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9jYXNlc1VLKSAjIHBhc3NlcyB0aGUgTEp1bmcgQm94IHRlc3QKZml0X2RlYXRoc1VLIDwtIGF1dG8uYXJpbWEoZGVhdGhzVUssIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X2RlYXRoc1VLICMgQVJJTUEoMSwgMSwgMyksIEFJQ2MgLSAxMzUwLjIzCmF1dG9wbG90KGZpdF9kZWF0aHNVSykKc2FyaW1hLmZvcihkZWF0aHNVS190cmFpbiwgbi5haGVhZCA9IDIwLCAxLCAxLCAzKQpsaW5lcyhkZWF0aHNVS190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfZGVhdGhzVUspCmZpdF9kZWF0aHNVSzIgPC0gYXJpbWEoZGVhdGhzVUssIG9yZGVyID0gYyg2LCAyLCA5KSkKY2hlY2tyZXNpZHVhbHMoZml0X2RlYXRoc1VLMikgIyBwLXZhbHVlID0gMC4wMTksIGNsb3Nlc3QgSSBjb3VsZCBnZXQgdG8gMC4wNQojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX1VLIDwtIHNhcmltYS5mb3IoY2FzZXNVSywgbi5haGVhZCA9IDEwLCAzLCAxLCAyKQpmY18xMF9VSyRwcmVkCmZjZF8xMF9VSyA8LSBzYXJpbWEuZm9yKGRlYXRoc1VLLCBuLmFoZWFkID0gMTAsIDYsIDIsIDkpIApmY2RfMTBfVUskcHJlZAojIG1vZGVscyBhcHBlYXIgdG8gY2FwdHVyZSB0cmVuZCBidXQgbm90IHZhcmlhdGlvbgpgYGAKSVYuIFN0YXRlIGxldmVsIHRpbWUgc2VyaWVzIGFuYWx5c2lzCiAgQS4gRmlsdGVyIGRhdGEgdG8gNyBrZXkgc3RhdGVzIChNTiwgQ08sIE1JLCBORSwgUEEsIFNELCBUWCkgCiAgQi4gUmVwbGljYXRlIEFSSU1BIG1vZGVscyBmb3IgZWFjaCBzdGF0ZQogIEMuIEZvcmVjYXN0IDEwIGRheXMgb3V0CiAgRC4gTXVsdGl2YXJpYXRlIHRzIGFuYWx5c2lzIChWQVIgYW5kIE1BUlNTKSBmb3IgTU4KYGBge3J9CiMgaHR0cHM6Ly9kYXRhc2NpZW5jZXBsdXMuY29tL3RpbWUtc2VyaWVzLWFuYWx5c2lzLXVzaW5nLWFyaW1hLW1vZGVsLWluLXIvCiMgaHR0cHM6Ly93d3cubWVkcnhpdi5vcmcvY29udGVudC8xMC4xMTAxLzIwMjAuMDQuMTcuMjAwNjkyMzd2MS5mdWxsLnBkZgojIGh0dHBzOi8vc3Vic2NyaXB0aW9uLnBhY2t0cHViLmNvbS9ib29rL2JpZ19kYXRhX2FuZF9idXNpbmVzc19pbnRlbGxpZ2VuY2UvOTc4MTc4MzU1MjA3OC8xL2NoMDFsdmwxc2VjMDgvbXVsdGl2YXJpYXRlLXRpbWUtc2VyaWVzLWFuYWx5c2lzCgpoZWFkKHRyYWluKQojIGZpbHRlciB0byBVUyBzdGF0ZXMgb25seSAocmVtb3ZlIGNvdW50eSkKdHJhaW5fc3RhdGVzIDwtIHRyYWluICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVTIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIiIpCmhlYWQodHJhaW5fc3RhdGVzKQp0YWlsKHRyYWluX3N0YXRlcykKIyBmaWx0ZXIgdG8gTU4KdHJhaW5fTU4gPC0gdHJhaW5fc3RhdGVzICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIk1pbm5lc290YSIpCmhlYWQodHJhaW5fTU4pCnRhaWwodHJhaW5fTU4pCiMgY29udmVydCBkYXRhc2V0IHRvIHRpbWUgc2VyaWVzIGFuZCBwbG90CnRzTU4gPC0gdHModHJhaW5fTU5bLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCnN0cih0c01OKQphdXRvcGxvdCh0c01OLCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBNaW5uZXNvdGEiKQojIHJlcGVhdCBmb3IgQ08KdHJhaW5fQ08gPC0gdHJhaW5fc3RhdGVzICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIkNvbG9yYWRvIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIiIpCnRhaWwodHJhaW5fQ08pCnRzQ08gPC0gdHModHJhaW5fQ09bLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KHRzQ08sIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIENvbG9yYWRvIikKIyByZXBlYXQgZm9yIE1JCnRyYWluX01JIDwtIHRyYWluX3N0YXRlcyAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJNaWNoaWdhbiIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICIiKQp0YWlsKHRyYWluX01JKQp0c01JIDwtIHRzKHRyYWluX01JWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c01JLCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBNaWNoaWdhbiIpCiMgcmVwZWF0IGZvciBORQp0cmFpbl9ORSA8LSB0cmFpbl9zdGF0ZXMgJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiTmVicmFza2EiKSAlPiUgZmlsdGVyKENvdW50eSA9PSAiIikKdGFpbCh0cmFpbl9ORSkKdHNORSA8LSB0cyh0cmFpbl9ORVssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNORSwgbWFpbiA9ICJDT1ZJRC0xOSBDYXNlcyBhbmQgRGVhdGhzIC0gTmVicmFza2EiKQojIHJlcGVhdCBmb3IgUEEKdHJhaW5fUEEgPC0gdHJhaW5fc3RhdGVzICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIlBlbm5zeWx2YW5pYSIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICIiKQp0YWlsKHRyYWluX1BBKQp0c1BBIDwtIHRzKHRyYWluX1BBWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c1BBLCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBQZW5uc3lsdmFuaWEiKQojIHJlcGVhdCBmb3IgU0QKdHJhaW5fU0QgPC0gdHJhaW5fc3RhdGVzICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIlNvdXRoIERha290YSIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICIiKQp0YWlsKHRyYWluX1NEKQp0c1NEIDwtIHRzKHRyYWluX1NEWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c1NELCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBTb3V0aCBEYWtvdGEiKQojIHJlcGVhdCBmb3IgVFgKdHJhaW5fVFggPC0gdHJhaW5fc3RhdGVzICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIlRleGFzIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIiIpCnRhaWwodHJhaW5fVFgpCnRzVFggPC0gdHModHJhaW5fVFhbLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KHRzVFgsIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIFRleGFzIikKCiMgQnVpbGQgbW9kZWxzIGZvciBNTgojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMsIERJRkZFUkVOQ0VEIERBVEEgU0VUUwpjYXNlc01OIDwtIHRzTU5bLCAiQ2FzZXMiXQpjYXNlc01OX3RyYWluIDwtIGNhc2VzTU4gJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCmNhc2VzTU5fdGVzdCA8LSBjYXNlc01OICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpkaWZmX2Nhc2VzTU4gPC0gZGlmZihjYXNlc01OKQpkZWF0aHNNTiA8LSB0c01OWywgIkRlYXRocyJdCmRlYXRoc01OX3RyYWluIDwtIGRlYXRoc01OICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpkZWF0aHNNTl90ZXN0IDwtIGRlYXRoc01OICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpkaWZmX2RlYXRoc01OIDwtIGRpZmYoZGVhdGhzTU4pCmF1dG8uYXJpbWEodHNNTiwgc3RlcHdpc2UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkgIyBBUklNQSBJUyBVTklWQVJJQVRFIE9OTFkKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X2Nhc2VzTU4gPC0gYXV0by5hcmltYShjYXNlc01OLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9jYXNlc01OICMgQVJJTUEoNCwgMiwgMSksIEFJQ2MgLSAxMTA1Ljg1CmF1dG9wbG90KGZpdF9jYXNlc01OKQpzYXJpbWEuZm9yKGNhc2VzTU5fdHJhaW4sIG4uYWhlYWQgPSAyMCwgNCwgMiwgMSkKbGluZXMoY2FzZXNNTl90ZXN0KSAjIEVSUk9SCmNoZWNrcmVzaWR1YWxzKGZpdF9jYXNlc01OKSAjIHAtdmFsdWUgdG9vIGxvdwpmaXRfY2FzZXNNTjIgPC0gYXJpbWEoY2FzZXNNTiwgb3JkZXIgPSBjKDYsIDIsIDEpKQpjaGVja3Jlc2lkdWFscyhmaXRfY2FzZXNNTjIpICMgcGFzc2VzIExqdW5nLUJveCB0ZXN0CmNvZWZ0ZXN0KGZpdF9jYXNlc01OMikKZml0X2RlYXRoc01OIDwtIGF1dG8uYXJpbWEoZGVhdGhzTU4sIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X2RlYXRoc01OICMgQVJJTUEoMSwgMSwgMiksIEFJQ2MgLSA1NzcuMTgKYXV0b3Bsb3QoZml0X2RlYXRoc01OKQpzYXJpbWEuZm9yKGRlYXRoc01OX3RyYWluLCBuLmFoZWFkID0gMjAsIDEsIDEsIDIpCmxpbmVzKGRlYXRoc01OX3Rlc3QpICMgRVJST1IKY2hlY2tyZXNpZHVhbHMoZml0X2RlYXRoc01OKQpmaXRfZGVhdGhzTU4yIDwtIGFyaW1hKGRlYXRoc01OLCBvcmRlciA9IGMoNCwgMSwgMikpCmNoZWNrcmVzaWR1YWxzKGZpdF9kZWF0aHNNTjIpICMgcGFzc2VzIExqdW5nLUJveCB0ZXN0CmNvZWZ0ZXN0KGZpdF9kZWF0aHNNTjIpCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfTU4gPC0gc2FyaW1hLmZvcihjYXNlc01OLCBuLmFoZWFkID0gMTAsIDYsIDIsIDEpCmZjXzEwX01OJHByZWQKZmNkXzEwX01OIDwtIHNhcmltYS5mb3IoZGVhdGhzTU4sIG4uYWhlYWQgPSAxMCwgNCwgMSwgMikgCmZjZF8xMF9NTiRwcmVkCiMgYm90aCBtb2RlbHMgYXJlIHRyZW5kaW5nIHVwIGJ1dCBkZWF0aHMgYXJlIGNsaW1iaW5nIHN0ZWFkaWx5IHdoaWxlIGNhc2VzIHNob3cgdmFyaWF0aW9uCgojIEludmVzdGlnYXRlIE1OIG11bHRpdmFyaWF0ZSB0aW1lIHNlcmllcyBhbmFseXNpcyAtIHVzaW5nIGNhc2VzIGFuZCBkZWF0aHMgYXMgY292YXJpYXRlcwojIGh0dHBzOi8vYm9va2Rvd24ub3JnL3NpbmdoX3ByYXRhcF90ZWplbmRyYS9pbnRyb190aW1lX3Nlcmllc19yL211bHRpdmFyaWF0ZS10cy1hbmFseXNpcy5odG1sCiMgaHR0cDovL3Bhc3QucmluZmluYW5jZS5jb20vYWdlbmRhLzIwMTMvdGFsay9SdWV5VHNheS5wZGYKIyBodHRwczovL3N1YnNjcmlwdGlvbi5wYWNrdHB1Yi5jb20vYm9vay9iaWdfZGF0YV9hbmRfYnVzaW5lc3NfaW50ZWxsaWdlbmNlLzk3ODE3ODM1NTIwNzgvMS9jaDAxbHZsMXNlYzA4L211bHRpdmFyaWF0ZS10aW1lLXNlcmllcy1hbmFseXNpcwphcHBseSh0c01OLCAyLCBhZGYudGVzdCkKdHNNTgp0c01OMSA8LSB0c01OWzE6OTgsIF0KdHNNTjIgPC0gdHNNTls5OToxMDgsIF0KdHNNTjFfZGlmZiA8LSBkaWZmTSh0c01OMSkKYXBwbHkodHNNTjFfZGlmZiwgMiwgYWRmLnRlc3QpICMgbm93IHN0YXRpb25hcnkgKHAgdmFsdWUgPCAwLjA1KQpwbG90LnRzKHRzTU4xX2RpZmYpCmNsYXNzKHRzTU4xX2RpZmYpCmF1dG9wbG90KHRzKHRzTU4xX2RpZmYsIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkpICsKICBnZ3RpdGxlKCJUaW1lIFNlcmllcyBQbG90IG9mIHRoZSBzdGF0aW9uYXJ5IHRzTU4iKQojIGxhZyBvcmRlciBpZGVudGlmaWNhdGlvbgpWQVJzZWxlY3QodHNNTjFfZGlmZiwgdHlwZSA9ICJub25lIiwgbGFnLm1heCA9IDEwKQp2YXIuTU4xIDwtIFZBUih0c01OMV9kaWZmLCBsYWcubWF4ID0gMTAsIGljID0gIkFJQyIpCnN1bW1hcnkodmFyLk1OMSkKcGFyKG1hciA9IGMoMi41LCAyLjUsIDIuNSwgMi41KSkKcGxvdCh2YXIuTU4xKQpjb2VmKHZhci5NTjEpCnJlc2lkdWFscyh2YXIuTU4xKQpmaXR0ZWQodmFyLk1OMSkKUGhpKHZhci5NTjEpCnNlcmlhbC50ZXN0KHZhci5NTjEpCmNhdXNhbGl0eSh2YXIuTU4xLCBjYXVzZSA9IGMoIkNhc2VzIikpCmNhdXNhbGl0eSh2YXIuTU4xLCBjYXVzZSA9IGMoIkRlYXRocyIpKQp2YXIucHJlZCA8LSBwcmVkaWN0KHZhci5NTjEsIG4uYWhlYWQgPSAxMCkKcGxvdCh2YXIucHJlZCkKdmFyLmlyZiA8LSBpcmYodmFyLk1OMSkKcGxvdCh2YXIuaXJmKQpwcmVkX2Nhc2VzTU4gPC0gdmFyLnByZWQkZmNzdFsxXQpwcmVkX2Nhc2VzTU4KeCA8LSBwcmVkX2Nhc2VzTU4kQ2FzZXNbLCAxXQpwcmVkX2RlYXRoc01OIDwtIHZhci5wcmVkJGZjc3RbMl0KcHJlZF9kZWF0aHNNTgp5IDwtIHByZWRfZGVhdGhzTU4kRGVhdGhzWywgMV0KIyBpbnZlcnRpbmcgdGhlIGRpZmZlcmVuY2UgKGFkZCBsYXN0IHZhbHVlIGZyb20gdGltZSBzZXJpZXMgdG8geCBhbmQgeSkKdHNNTjEKeCA8LSBjdW1zdW0oeCkgKyA0NjMgIyBsYXN0IHZhbHVlIGZvciBjYXNlcwp5IDwtIGN1bXN1bSh5KSArIDE4ICMgbGFzdCB2YWx1ZSBmb3IgZGVhdGhzCnBhcihtZnJvdyA9IGMoMiwgMSkpCnBsb3QudHMoeCkKcGxvdC50cyh5KQpwYXIobWZyb3cgPSBjKDEsIDEpKQp6IDwtIGNiaW5kKHgsIHkpCnoKY29sbmFtZXMoeikgPC0gYygiQ2FzZXMiLCAiRGVhdGhzIikKeiA8LSB0cyh6LCBzdGFydCA9IGMoMjAyMCwgMTIxKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh6KQphdXRvcGxvdCh6LCBjb2xvciA9ICJibGFjayIpICsKICBhdXRvbGF5ZXIodHNNTikKdGFpbCh0c01OKQojIGNvaW50ZWdyYXRlZCBWQVIgYW5kIFZFQ00gKFZlY3RvciBFcnJvciBDb3JyZWN0aW9uIE1vZGVscykKY3JlZ3IgPC0gbG0oeCB+IHkpCnIgPSBjcmVnciRyZXNpZHVhbHMKYWRmLnRlc3QocikgIyBpZiByIGNvbnN0aXR1dGVzIGEgc3RhdGlvbmFyeSBzZXJpZXMsIDIgc2VyaWVzIGFyZSBjb2ludGVncmF0ZWQKY2hlY2tyZXNpZHVhbHMoY3JlZ3IpICMgaGlnaGVyIHAtdmFsdWUgaW5kaWNhdGVzIHN0YXRpb25hcnkKcG8uY29pbnQgPC0gcG8udGVzdCh6LCBkZW1lYW4gPSBUUlVFLCBsc2hvcnQgPSBUUlVFKQpwby5jb2ludCAjIHAtdmFsdWUgaGlnaGVyIHRoYW4gMC4wNSBtZWFucyB0aGF0IHdlIGNhbid0IHJlamVjdCBudWxsIGh5cG90aGVzaXMsIHNvIHR3byBzZXJpZXMgYXJlIG5vdCBjb2ludGVncmF0ZWQKekpvVGVzdCA8LSBjYS5qbyh6LCB0eXBlID0gYygidHJhY2UiKSwgZWNkZXQgPSBjKCJub25lIiksIEsgPSAyKSAjIGVycm9yCnpKb1Rlc3QKCiMgTUFSU1MgcGFja2FnZQojIGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9NQVJTUy92aWduZXR0ZXMvVXNlckd1aWRlLnBkZgojIE11bHRpdmFyaWF0ZSBBdXRvLVJlZ3Jlc3NpdmUgKHNhbWVzIGFzIGR5bmFtaWMgbGluZWFyIG1vZGVscyAoRExNcykgYW5kIHZlY3RvciBhdXRvcmVncmVzc2l2ZXMgKFZBUikgc3RhdGUtc3BhY2UgbW9kZWxzKQojIGh0dHBzOi8vbndmc2MtdGltZXNlcmllcy5naXRodWIuaW8vYXRzYS1sYWJzL3NlYy1tc3Njb3YtbW9kZWwtZGlhZ25vc3RpY3MuaHRtbApkYXQgPC0gZGF0YS5mcmFtZShZciA9IGZsb29yKHRpbWUodHNNTikgKyAuTWFjaGluZSRkb3VibGUuZXBzKSwgRGF5ID0gY3ljbGUodHNNTiksIHRzTU4pCmRhdApkYXQgPC0gdChkYXQpCmRhdApjb3ZhcmlhdGVzID0gdCh0c01OWywgYygiQ2FzZXMiLCAiRGVhdGhzIildKQojIE9ic2VydmF0aW9uLWVycm9yIG9ubHkgbW9kZWwKUSA8LSBVIDwtIHgwIDwtICJ6ZXJvIgpCIDwtIFogPC0gImlkZW50aXR5IgpkIDwtIGNvdmFyaWF0ZXMKQSA8LSAiemVybyIKRCA8LSAidW5jb25zdHJhaW5lZCIKeSA8LSBkYXQKbW9kZWwubGlzdCA8LSBsaXN0KEIgPSBCLCBVID0gVSwgUSA9IFEsIFogPSBaLCBBID0gQSwgRCA9IEQsIGQgPSBkLCB4MCA9IHgwKQptYXJzc2ZpdCA8LSBNQVJTUyh5LCBtb2RlbCA9IG1vZGVsLmxpc3QpCiMgUHJvY2Vzcy1lcnJvciBvbmx5IG1vZGVsClIgPC0gQSA8LSBVIDwtICJ6ZXJvIgpRIDwtICJlcXVhbHZhcmNvdiIKQyA8LSAidW5jb25zdHJhaW5lZCIKbW9kZWwubGlzdDIgPC0gbGlzdChCID0gQiwgVSA9IFUsIFEgPSBRLCBaID0gWiwgQSA9IEEsIFIgPSBSLCBDID0gQywgYyA9IGNvdmFyaWF0ZXMpCm1hcnNzZml0MiA8LSBNQVJTUyh5LCBtb2RlbCA9IG1vZGVsLmxpc3QyKQojIHN3aXRjaCB0byBiZXR0ZXIgYXV0b3JlZ3Jlc3NpdmUgbW9kZWwgKG1lYW4gcmV2ZXJ0aW5nIG1vZGVsKQptb2RlbC5saXN0MiRCIDwtICJkaWFnb25hbCBhbmQgdW5lcXVhbCIKbWFyc3NmaXQzIDwtIE1BUlNTKHksIG1vZGVsID0gbW9kZWwubGlzdDIpICMgaGlnaGVyIGxvZy1saWtlbGlob29kIG1lYW5zIGJldHRlciBtb2RlbAojIGJvdGggcHJvY2Vzcy0gYW5kIG9ic2VydmF0aW9uLWVycm9yIG1vZGVscwpEIDwtIGQgPC0gQSA8LSBVIDwtICJ6ZXJvIgpaIDwtICJpZGVudGl0eSIKQiA8LSAiZGlhZ29uYWwgYW5kIHVuZXF1YWwiClEgPC0gImVxdWFsdmFyY292IgpDIDwtICJ1bmNvbnN0cmFpbmVkIgpjIDwtIGNvdmFyaWF0ZXMKeDAgPC0gInVuZXF1YWwiCnRpbml0eCA8LSAxCm1vZGVsLmxpc3Q0IDwtIGxpc3QoQiA9IEIsIFUgPSBVLCBRID0gUSwgWiA9IFosIEEgPSBBLCBEID0gRCwgZCA9IGQsIEMgPSBDLCBjID0gYywgeDAgPSB4MCwgdGluaXR4ID0gdGluaXR4KQptYXJzc2ZpdDQgPC0gTUFSU1MoeSwgbW9kZWwgPSBtb2RlbC5saXN0NCkgIyBsb2cgbGlrZWxpaG9vZCBkb3duCiMgYm90aCBwcm9jZXNzIGFuZCBvYnMgZXJyb3IgYnV0IGNvdmFyaWF0ZXMgb25seSBhZmZlY3QgdGhlIG9ic2VydmF0aW9uIHByb2Nlc3MKQyA8LSBjIDwtIEEgPC0gVSA8LSAiemVybyIKWiA8LSAiaWRlbnRpdHkiCkIgPC0gImRpYWdvbmFsIGFuZCB1bmVxdWFsIgpRIDwtICJlcXVhbHZhcmNvdiIKRCA8LSAidW5jb25zdHJhaW5lZCIKZCA8LSBjb3ZhcmlhdGVzCngwIDwtICJ1bmVxdWFsIgp0aW5pdHggPC0gMQptb2RlbC5saXN0NSA8LSBsaXN0KEIgPSBCLCBVID0gVSwgUSA9IFEsIFogPSBaLCBBID0gQSwgRCA9IEQsIGQgPSBkLCBDID0gQywgYyA9IGMsIHgwID0geDAsIHRpbml0eCA9IHRpbml0eCkKbWFyc3NmaXQ1IDwtIE1BUlNTKHksIG1vZGVsID0gbW9kZWwubGlzdDUpICMgYmV0dGVyIG1vZGVsIHRoYW4gNCBidXQgd29yc2UgdGhhbiAzCiMgSW52ZXN0aWdhdGUgdGhpcyBmdXJ0aGVyIGF0IGNvdW50eSBsZXZlbAoKIyBSZXBlYXQgZm9yIENPCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUywgRElGRkVSRU5DRUQgREFUQSBTRVRTCmNhc2VzQ08gPC0gdHNDT1ssICJDYXNlcyJdCmNhc2VzQ09fdHJhaW4gPC0gY2FzZXNDTyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKY2FzZXNDT190ZXN0IDwtIGNhc2VzQ08gJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCmRpZmZfY2FzZXNDTyA8LSBkaWZmKGNhc2VzQ08pCmRlYXRoc0NPIDwtIHRzQ09bLCAiRGVhdGhzIl0KZGVhdGhzQ09fdHJhaW4gPC0gZGVhdGhzQ08gJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCmRlYXRoc0NPX3Rlc3QgPC0gZGVhdGhzQ08gJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCmRpZmZfZGVhdGhzQ08gPC0gZGlmZihkZWF0aHNDTykKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X2Nhc2VzQ08gPC0gYXV0by5hcmltYShjYXNlc0NPLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9jYXNlc0NPICMgQVJJTUEoNCwgMSwgMSksIEFJQ2MgLSAxMzc0LjM0CmF1dG9wbG90KGZpdF9jYXNlc0NPKQpzYXJpbWEuZm9yKGNhc2VzQ09fdHJhaW4sIG4uYWhlYWQgPSAyMCwgNCwgMSwgMSkKbGluZXMoY2FzZXNDT190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfY2FzZXNDTykgIyBwYXNzZXMgdGhlIExqdW5nIEJveCB0ZXN0CmZpdF9kZWF0aHNDTyA8LSBhdXRvLmFyaW1hKGRlYXRoc0NPLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9kZWF0aHNDTyAjIEFSSU1BKDIsIDEsIDIpLCBBSUNjIC0gODcxLjExCmF1dG9wbG90KGZpdF9kZWF0aHNDTykKc2FyaW1hLmZvcihkZWF0aHNDT190cmFpbiwgbi5haGVhZCA9IDIwLCAyLCAxLCAyKQpsaW5lcyhkZWF0aHNDT190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfZGVhdGhzQ08pICMgcC12YWx1ZSB0b28gbG93CmZpdF9kZWF0aHNDTzIgPC0gYXJpbWEoZGVhdGhzQ08sIG9yZGVyID0gYygxMCwgMSwgMikpCmNoZWNrcmVzaWR1YWxzKGZpdF9kZWF0aHNDTzIpICMgcGFzc2VzIHRoZSBManVuZyBCb3ggdGVzdAojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX0NPIDwtIHNhcmltYS5mb3IoY2FzZXNDTywgbi5haGVhZCA9IDEwLCA0LCAxLCAxKQpmY18xMF9DTyRwcmVkCmZjZF8xMF9DTyA8LSBzYXJpbWEuZm9yKGRlYXRoc0NPLCBuLmFoZWFkID0gMTAsIDEwLCAxLCAyKSAKZmNkXzEwX0NPJHByZWQKIyBjYXNlcyBhcmUgdHJlbmRpbmcgdXAgYnV0IGRlYXRocyBhcHBlYXIgdG8gYmUgc3RlYWR5CgojIFJlcGVhdCBmb3IgTUkKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTLCBESUZGRVJFTkNFRCBEQVRBIFNFVFMKY2FzZXNNSSA8LSB0c01JWywgIkNhc2VzIl0KY2FzZXNNSV90cmFpbiA8LSBjYXNlc01JICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpjYXNlc01JX3Rlc3QgPC0gY2FzZXNNSSAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKZGlmZl9jYXNlc01JIDwtIGRpZmYoY2FzZXNNSSkKZGVhdGhzTUkgPC0gdHNNSVssICJEZWF0aHMiXQpkZWF0aHNNSV90cmFpbiA8LSBkZWF0aHNNSSAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKZGVhdGhzTUlfdGVzdCA8LSBkZWF0aHNNSSAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKZGlmZl9kZWF0aHNNSSA8LSBkaWZmKGRlYXRoc01JKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBDb25zaXN0ZW5jeQpmaXRfY2FzZXNNSSA8LSBhdXRvLmFyaW1hKGNhc2VzTUksIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X2Nhc2VzTUkgIyBBUklNQSgzLCAxLCAwKSwgQUlDYyAtIDE0NDYuNjcKYXV0b3Bsb3QoZml0X2Nhc2VzTUkpCnNhcmltYS5mb3IoY2FzZXNNSV90cmFpbiwgbi5haGVhZCA9IDIwLCAzLCAxLCAwKQpsaW5lcyhjYXNlc01JX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9jYXNlc01JKSAjIHBhc3NlcyB0aGUgTGp1bmcgQm94IHRlc3QKZml0X2RlYXRoc01JIDwtIGF1dG8uYXJpbWEoZGVhdGhzTUksIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X2RlYXRoc01JICMgQVJJTUEoMywgMSwgMiksIEFJQ2MgLSAxMDMwLjE1CmF1dG9wbG90KGZpdF9kZWF0aHNNSSkKc2FyaW1hLmZvcihkZWF0aHNNSV90cmFpbiwgbi5haGVhZCA9IDIwLCAzLCAxLCAyKQpsaW5lcyhkZWF0aHNNSV90ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfZGVhdGhzTUkpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfTUkgPC0gc2FyaW1hLmZvcihjYXNlc01JLCBuLmFoZWFkID0gMTAsIDMsIDEsIDApCmZjXzEwX01JJHByZWQKZmNkXzEwX01JIDwtIHNhcmltYS5mb3IoZGVhdGhzTUksIG4uYWhlYWQgPSAxMCwgMywgMSwgMikgCmZjZF8xMF9NSSRwcmVkCiMgYm90aCBtb2RlbHMgc2hvdyBhIHNsaWdodCB1cHdhcmQgdHJlbmQgd2hlbiB0aGUgZ3JhcGhzIGFwcGVhciB0byBiZSB0cmVuZGluZyBkb3duCgojIFJlcGVhdCBmb3IgTkUKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTLCBESUZGRVJFTkNFRCBEQVRBIFNFVFMKY2FzZXNORSA8LSB0c05FWywgIkNhc2VzIl0KY2FzZXNORV90cmFpbiA8LSBjYXNlc05FICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpjYXNlc05FX3Rlc3QgPC0gY2FzZXNORSAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKZGlmZl9jYXNlc05FIDwtIGRpZmYoY2FzZXNORSkKZGVhdGhzTkUgPC0gdHNORVssICJEZWF0aHMiXQpkZWF0aHNORV90cmFpbiA8LSBkZWF0aHNORSAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKZGVhdGhzTkVfdGVzdCA8LSBkZWF0aHNORSAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKZGlmZl9kZWF0aHNORSA8LSBkaWZmKGRlYXRoc05FKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBDb25zaXN0ZW5jeQpmaXRfY2FzZXNORSA8LSBhdXRvLmFyaW1hKGNhc2VzTkUsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X2Nhc2VzTkUgIyBBUklNQSg1LCAxLCAwKSwgQUlDYyAtIDExODMuMTMKYXV0b3Bsb3QoZml0X2Nhc2VzTkUpCnNhcmltYS5mb3IoY2FzZXNORV90cmFpbiwgbi5haGVhZCA9IDIwLCA1LCAxLCAwKQpsaW5lcyhjYXNlc05FX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9jYXNlc05FKSAjIHAtdmFsdWUgaXMgdG9vIGxvdwpmaXRfY2FzZXNORTIgPC0gYXJpbWEoY2FzZXNORSwgb3JkZXIgPSBjKDUsIDIsIDQpKQpjaGVja3Jlc2lkdWFscyhmaXRfY2FzZXNORTIpICMgcC12YWx1ZSA9IDAuMDExIChjbG9zZXN0IEkgY291bGQgZ2V0IHRvIDAuMDUpIC0gbm90IGEgZ29vZCBtb2RlbApmaXRfZGVhdGhzTkUgPC0gYXV0by5hcmltYShkZWF0aHNORSwgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfZGVhdGhzTkUgIyBBUklNQSgyLCAxLCAzKSwgQUlDYyAtIDQ0MS4xNgphdXRvcGxvdChmaXRfZGVhdGhzTkUpCnNhcmltYS5mb3IoZGVhdGhzTkVfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMiwgMSwgMykKbGluZXMoZGVhdGhzTkVfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X2RlYXRoc05FKSAjIHAtdmFsdWUgdG9vIGxvdwpmaXRfZGVhdGhzTkUyIDwtIGFyaW1hKGRlYXRoc05FLCBvcmRlciA9IGMoMiwgMiwgNCkpCmNoZWNrcmVzaWR1YWxzKGZpdF9kZWF0aHNORTIpICMgcGFzc2VzIHRoZSBManVuZyBCb3ggdGVzdAojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX05FIDwtIHNhcmltYS5mb3IoY2FzZXNORSwgbi5haGVhZCA9IDEwLCA1LCAyLCA0KQpmY18xMF9ORSRwcmVkCmZjZF8xMF9ORSA8LSBzYXJpbWEuZm9yKGRlYXRoc05FLCBuLmFoZWFkID0gMTAsIDIsIDIsIDQpIApmY2RfMTBfTkUkcHJlZAojIGNhc2VzIG1vZGVsIGxvb2tzIG9rYXkgYnV0IGRlYXRocyBtb2RlbCBpcyBza2V3ZWQgYmVjYXVzZSBuZWdhdGl2ZSBkZWF0aHMgd2VyZSByZXBvcnRlZCBieSBORQoKIyBSZXBlYXQgZm9yIFBBCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUywgRElGRkVSRU5DRUQgREFUQSBTRVRTCmNhc2VzUEEgPC0gdHNQQVssICJDYXNlcyJdCmNhc2VzUEFfdHJhaW4gPC0gY2FzZXNQQSAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKY2FzZXNQQV90ZXN0IDwtIGNhc2VzUEEgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCmRpZmZfY2FzZXNQQSA8LSBkaWZmKGNhc2VzUEEpCmRlYXRoc1BBIDwtIHRzUEFbLCAiRGVhdGhzIl0KZGVhdGhzUEFfdHJhaW4gPC0gZGVhdGhzUEEgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCmRlYXRoc1BBX3Rlc3QgPC0gZGVhdGhzUEEgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCmRpZmZfZGVhdGhzUEEgPC0gZGlmZihkZWF0aHNQQSkKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X2Nhc2VzUEEgPC0gYXV0by5hcmltYShjYXNlc1BBLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9jYXNlc1BBICMgQVJJTUEoMCwgMSwgNSksIEFJQ2MgLSAxNDc4LjkzCmF1dG9wbG90KGZpdF9jYXNlc1BBKQpzYXJpbWEuZm9yKGNhc2VzUEFfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMCwgMSwgNSkKbGluZXMoY2FzZXNQQV90ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfY2FzZXNQQSkgIyBwLXZhbHVlIHRvbyBsb3cKZml0X2Nhc2VzUEEyIDwtIGFyaW1hKGNhc2VzUEEsIG9yZGVyID0gYygxLCAxLCA2KSkKY2hlY2tyZXNpZHVhbHMoZml0X2Nhc2VzUEEyKSAjIHBhc3NlcyB0aGUgTGp1bmcgQm94IHRlc3QKZml0X2RlYXRoc1BBIDwtIGF1dG8uYXJpbWEoZGVhdGhzUEEsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X2RlYXRoc1BBICMgQVJJTUEoNSwgMSwgMCksIEFJQ2MgLSAxMTE3LjcKYXV0b3Bsb3QoZml0X2RlYXRoc1BBKQpzYXJpbWEuZm9yKGRlYXRoc1BBX3RyYWluLCBuLmFoZWFkID0gMjAsIDUsIDEsIDApCmxpbmVzKGRlYXRoc1BBX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9kZWF0aHNQQSkgIyBwYXNzZXMKIyBVc2UgYmVzdCBtb2RlbHMgdG8gZm9yZWNhc3QgZnVydGhlciBhaGVhZApmY18xMF9QQSA8LSBzYXJpbWEuZm9yKGNhc2VzUEEsIG4uYWhlYWQgPSAxMCwgMSwgMSwgNikKZmNfMTBfUEEkcHJlZApmY2RfMTBfUEEgPC0gc2FyaW1hLmZvcihkZWF0aHNQQSwgbi5haGVhZCA9IDEwLCA1LCAxLCAwKSAKZmNkXzEwX1BBJHByZWQKIyBib3RoIG1vZGVsIG1hdGNoIHByaW9yIHRyZW5kcyBhbHRob3VnaCBkZWF0aHMgaXMgbW9yZSBhY3RpdmUKCiMgUmVwZWF0IGZvciBTRAojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMsIERJRkZFUkVOQ0VEIERBVEEgU0VUUwpjYXNlc1NEIDwtIHRzU0RbLCAiQ2FzZXMiXQpjYXNlc1NEX3RyYWluIDwtIGNhc2VzU0QgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCmNhc2VzU0RfdGVzdCA8LSBjYXNlc1NEICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpkaWZmX2Nhc2VzU0QgPC0gZGlmZihjYXNlc1NEKQpkZWF0aHNTRCA8LSB0c1NEWywgIkRlYXRocyJdCmRlYXRoc1NEX3RyYWluIDwtIGRlYXRoc1NEICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpkZWF0aHNTRF90ZXN0IDwtIGRlYXRoc1NEICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpkaWZmX2RlYXRoc1NEIDwtIGRpZmYoZGVhdGhzU0QpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9jYXNlc1NEIDwtIGF1dG8uYXJpbWEoY2FzZXNTRCwgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfY2FzZXNTRCAjIEFSSU1BKDAsIDEsIDMpLCBBSUNjIC0gOTMzLjM0CmF1dG9wbG90KGZpdF9jYXNlc1NEKQpzYXJpbWEuZm9yKGNhc2VzU0RfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMCwgMSwgMykKbGluZXMoY2FzZXNTRF90ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfY2FzZXNTRCkgIyBkb2Vzbid0IHBhc3MgTGp1bmctQm94IHRlc3QKZml0X2Nhc2VzU0QyIDwtIGFyaW1hKGNhc2VzU0QsIG9yZGVyID0gYygyLCAxLCA1KSkKY2hlY2tyZXNpZHVhbHMoZml0X2Nhc2VzU0QyKSAjIHAtdmFsdWUgPSAwLjAxOCAoY2xvc2VzdCBJIGNvdWxkIGdldCB0byAwLjA1KSAtIG5vdCBhIGdvb2QgbW9kZWwKZml0X2RlYXRoc1NEIDwtIGF1dG8uYXJpbWEoZGVhdGhzU0QsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X2RlYXRoc1NEICMgQVJJTUEoNCwgMSwgMCksIEFJQ2MgLSAyMTcuMzcKYXV0b3Bsb3QoZml0X2RlYXRoc1NEKQpzYXJpbWEuZm9yKGRlYXRoc1NEX3RyYWluLCBuLmFoZWFkID0gMjAsIDQsIDEsIDApCmxpbmVzKGRlYXRoc1NEX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9kZWF0aHNTRCkgIyBwYXNzZXMgTGp1bmctQm94IHRlc3QKIyBVc2UgYmVzdCBtb2RlbHMgdG8gZm9yZWNhc3QgZnVydGhlciBhaGVhZApmY18xMF9TRCA8LSBzYXJpbWEuZm9yKGNhc2VzU0QsIG4uYWhlYWQgPSAxMCwgMiwgMSwgNSkKZmNfMTBfU0QkcHJlZApmY2RfMTBfU0QgPC0gc2FyaW1hLmZvcihkZWF0aHNTRCwgbi5haGVhZCA9IDEwLCA0LCAxLCAwKSAKZmNkXzEwX1NEJHByZWQKIyBib3RoIG1vZGVsIG1hdGNoIHByaW9yIHRyZW5kcyBhbHRob3VnaCBkZWF0aHMgaXMgbW9yZSBhY3RpdmUKCiMgUmVwZWF0IGZvciBUWAojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMsIERJRkZFUkVOQ0VEIERBVEEgU0VUUwpjYXNlc1RYIDwtIHRzVFhbLCAiQ2FzZXMiXQpjYXNlc1RYX3RyYWluIDwtIGNhc2VzVFggJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCmNhc2VzVFhfdGVzdCA8LSBjYXNlc1RYICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpkaWZmX2Nhc2VzVFggPC0gZGlmZihjYXNlc1RYKQpkZWF0aHNUWCA8LSB0c1RYWywgIkRlYXRocyJdCmRlYXRoc1RYX3RyYWluIDwtIGRlYXRoc1RYICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpkZWF0aHNUWF90ZXN0IDwtIGRlYXRoc1RYICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpkaWZmX2RlYXRoc1RYIDwtIGRpZmYoZGVhdGhzVFgpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9jYXNlc1RYIDwtIGF1dG8uYXJpbWEoY2FzZXNUWCwgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfY2FzZXNUWCAjIEFSSU1BKDUsIDEsIDApLCBBSUNjIC0gMTM1OC44MwphdXRvcGxvdChmaXRfY2FzZXNUWCkKc2FyaW1hLmZvcihjYXNlc1RYX3RyYWluLCBuLmFoZWFkID0gMjAsIDUsIDEsIDApCmxpbmVzKGNhc2VzVFhfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X2Nhc2VzVFgpICMgdG9vIGxvdwpmaXRfY2FzZXNUWDIgPC0gYXJpbWEoY2FzZXNUWCwgb3JkZXIgPSBjKDcsIDEsIDApKQpjaGVja3Jlc2lkdWFscyhmaXRfY2FzZXNUWDIpICMgcGFzc2VzIHRoZSBManVuZyBCb3ggdGVzdApmaXRfZGVhdGhzVFggPC0gYXV0by5hcmltYShkZWF0aHNUWCwgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfZGVhdGhzVFggIyBBUklNQSg1LCAxLCAwKSwgQUlDYyAtIDY4OS4wNgphdXRvcGxvdChmaXRfZGVhdGhzVFgpCnNhcmltYS5mb3IoZGVhdGhzVFhfdHJhaW4sIG4uYWhlYWQgPSAyMCwgNSwgMSwgMCkKbGluZXMoZGVhdGhzVFhfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X2RlYXRoc1RYKSAjIHBhc3NlcwojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX1RYIDwtIHNhcmltYS5mb3IoY2FzZXNUWCwgbi5haGVhZCA9IDEwLCA3LCAxLCAwKQpmY18xMF9UWCRwcmVkCmZjZF8xMF9UWCA8LSBzYXJpbWEuZm9yKGRlYXRoc1RYLCBuLmFoZWFkID0gMTAsIDUsIDEsIDApIApmY2RfMTBfVFgkcHJlZAojIGJvdGggbW9kZWxzIGFwcGVhciB2ZXJ5IHN0cm9uZwpgYGAKVi4gQ291bnR5IGxldmVsIHRpbWUgc2VyaWVzIGFuYWx5c2lzCiAgQS4gRmlsdGVyIGRhdGEgdG8gMzQga2V5IGNvdW50aWVzIChNTiAtIDksIENPIC0gOCwgTUkgLSA0LCBORSAtIDQsIFBBIC0gMywgU0QgLSAyLCBUWCAtIDQpIAogIEIuIFJlcGxpY2F0ZSBBUklNQSBtb2RlbHMgZm9yIGVhY2ggY291bnR5CiAgQy4gRm9yZWNhc3QgMTAgZGF5cyBvdXQKYGBge3J9CiMgZmlsdGVyIHRvIE1OIGNvdW50aWVzCiMgQW5va2EKTU5fQW5va2EgPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiTWlubmVzb3RhIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIkFub2thIikKdHNBbm9rYU1OIDwtIHRzKE1OX0Fub2thWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c0Fub2thTU4sIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIEFub2thLCBNTiIpCiMgQ2xheQpNTl9DbGF5IDwtIHRyYWluICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIk1pbm5lc290YSIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICJDbGF5IikKdHNDbGF5TU4gPC0gdHMoTU5fQ2xheVssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNDbGF5TU4sIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIENsYXksIE1OIikKIyBEYWtvdGEKTU5fRGFrb3RhIDwtIHRyYWluICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIk1pbm5lc290YSIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICJEYWtvdGEiKQp0c0Rha290YU1OIDwtIHRzKE1OX0Rha290YVssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNEYWtvdGFNTiwgbWFpbiA9ICJDT1ZJRC0xOSBDYXNlcyBhbmQgRGVhdGhzIC0gRGFrb3RhLCBNTiIpCiMgSGVubmVwaW4KTU5fSGVubmVwaW4gPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiTWlubmVzb3RhIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIkhlbm5lcGluIikKdHNIZW5uZXBpbk1OIDwtIHRzKE1OX0hlbm5lcGluWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c0hlbm5lcGluTU4sIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIEhlbm5lcGluLCBNTiIpCiMgS2FuZGl5b2hpCk1OX0thbmRpeW9oaSA8LSB0cmFpbiAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJNaW5uZXNvdGEiKSAlPiUgZmlsdGVyKENvdW50eSA9PSAiS2FuZGl5b2hpIikKdHNLYW5kaXlvaGlNTiA8LSB0cyhNTl9LYW5kaXlvaGlbLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KHRzS2FuZGl5b2hpTU4sIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIEthbmRpeW9oaSwgTU4iKQojIE5vYmxlcwpNTl9Ob2JsZXMgPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiTWlubmVzb3RhIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIk5vYmxlcyIpCnRzTm9ibGVzTU4gPC0gdHMoTU5fTm9ibGVzWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c05vYmxlc01OLCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBOb2JsZXMsIE1OIikKIyBSYW1zZXkKTU5fUmFtc2V5IDwtIHRyYWluICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIk1pbm5lc290YSIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICJSYW1zZXkiKQp0c1JhbXNleU1OIDwtIHRzKE1OX1JhbXNleVssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNSYW1zZXlNTiwgbWFpbiA9ICJDT1ZJRC0xOSBDYXNlcyBhbmQgRGVhdGhzIC0gUmFtc2V5LCBNTiIpCiMgU3RlYXJucwpNTl9TdGVhcm5zIDwtIHRyYWluICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIk1pbm5lc290YSIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICJTdGVhcm5zIikKdHNTdGVhcm5zTU4gPC0gdHMoTU5fU3RlYXJuc1ssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNTdGVhcm5zTU4sIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIFN0ZWFybnMsIE1OIikKIyBXYXNoaW5ndG9uCk1OX1dhc2hpbmd0b24gPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiTWlubmVzb3RhIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIldhc2hpbmd0b24iKQp0c1dhc2hpbmd0b25NTiA8LSB0cyhNTl9XYXNoaW5ndG9uWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c1dhc2hpbmd0b25NTiwgbWFpbiA9ICJDT1ZJRC0xOSBDYXNlcyBhbmQgRGVhdGhzIC0gV2FzaGluZ3RvbiwgTU4iKQoKIyBmaWx0ZXIgdG8gQ08gY291bnRpZXMKIyBBZGFtcwpDT19BZGFtcyA8LSB0cmFpbiAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJDb2xvcmFkbyIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICJBZGFtcyIpCnRzQWRhbXNDTyA8LSB0cyhDT19BZGFtc1ssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNBZGFtc0NPLCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBBZGFtcywgQ08iKQojIEFyYXBhaG9lCkNPX0FyYXBhaG9lIDwtIHRyYWluICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIkNvbG9yYWRvIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIkFyYXBhaG9lIikKdHNBcmFwYWhvZUNPIDwtIHRzKENPX0FyYXBhaG9lWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c0FyYXBhaG9lQ08sIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIEFyYXBhaG9lLCBDTyIpCiMgQm91bGRlcgpDT19Cb3VsZGVyIDwtIHRyYWluICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIkNvbG9yYWRvIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIkJvdWxkZXIiKQp0c0JvdWxkZXJDTyA8LSB0cyhDT19Cb3VsZGVyWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c0JvdWxkZXJDTywgbWFpbiA9ICJDT1ZJRC0xOSBDYXNlcyBhbmQgRGVhdGhzIC0gQm91bGRlciwgQ08iKQojIERlbnZlcgpDT19EZW52ZXIgPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiQ29sb3JhZG8iKSAlPiUgZmlsdGVyKENvdW50eSA9PSAiRGVudmVyIikKdHNEZW52ZXJDTyA8LSB0cyhDT19EZW52ZXJbLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KHRzRGVudmVyQ08sIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIERlbnZlciwgQ08iKQojIERvdWdsYXMKQ09fRG91Z2xhcyA8LSB0cmFpbiAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJDb2xvcmFkbyIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICJEb3VnbGFzIikKdHNEb3VnbGFzQ08gPC0gdHMoQ09fRG91Z2xhc1ssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNEb3VnbGFzQ08sIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIERvdWdsYXMsIENPIikKIyBFbCBQYXNvCkNPX0VsUGFzbyA8LSB0cmFpbiAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJDb2xvcmFkbyIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICJFbCBQYXNvIikKdHNFbFBhc29DTyA8LSB0cyhDT19FbFBhc29bLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KHRzRWxQYXNvQ08sIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIEVsIFBhc28sIENPIikKIyBKZWZmZXJzb24KQ09fSmVmZmVyc29uIDwtIHRyYWluICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIkNvbG9yYWRvIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIkplZmZlcnNvbiIpCnRzSmVmZmVyc29uQ08gPC0gdHMoQ09fSmVmZmVyc29uWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c0plZmZlcnNvbkNPLCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBKZWZmZXJzb24sIENPIikKIyBXZWxkCkNPX1dlbGQgPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiQ29sb3JhZG8iKSAlPiUgZmlsdGVyKENvdW50eSA9PSAiV2VsZCIpCnRzV2VsZENPIDwtIHRzKENPX1dlbGRbLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KHRzV2VsZENPLCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBXZWxkLCBDTyIpCgojIGZpbHRlciB0byBNSSBjb3VudGllcwojIE1vbnJvZQpNSV9Nb25yb2UgPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiTWljaGlnYW4iKSAlPiUgZmlsdGVyKENvdW50eSA9PSAiTW9ucm9lIikKdHNNb25yb2VNSSA8LSB0cyhNSV9Nb25yb2VbLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KHRzTW9ucm9lTUksIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIE1vbnJvZSwgTUkiKQojIE1hY29tYgpNSV9NYWNvbWIgPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiTWljaGlnYW4iKSAlPiUgZmlsdGVyKENvdW50eSA9PSAiTWFjb21iIikKdHNNYWNvbWJNSSA8LSB0cyhNSV9NYWNvbWJbLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KHRzTWFjb21iTUksIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIE1hY29tYiwgTUkiKQojIE9ha2xhbmQKTUlfT2FrbGFuZCA8LSB0cmFpbiAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJNaWNoaWdhbiIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICJPYWtsYW5kIikKdHNPYWtsYW5kTUkgPC0gdHMoTUlfT2FrbGFuZFssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNPYWtsYW5kTUksIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIE9ha2xhbmQsIE1JIikKIyBXYXluZQpNSV9XYXluZSA8LSB0cmFpbiAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJNaWNoaWdhbiIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICJXYXluZSIpCnRzV2F5bmVNSSA8LSB0cyhNSV9XYXluZVssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNXYXluZU1JLCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBXYXluZSwgTUkiKQoKIyBmaWx0ZXIgdG8gTkUgY291bnRpZXMKIyBEYWtvdGEKTkVfRGFrb3RhIDwtIHRyYWluICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIk5lYnJhc2thIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIkRha290YSIpCnRzRGFrb3RhTkUgPC0gdHMoTkVfRGFrb3RhWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c0Rha290YU5FLCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBEYWtvdGEsIE5FIikKIyBEb3VnbGFzCk5FX0RvdWdsYXMgPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiTmVicmFza2EiKSAlPiUgZmlsdGVyKENvdW50eSA9PSAiRG91Z2xhcyIpCnRzRG91Z2xhc05FIDwtIHRzKE5FX0RvdWdsYXNbLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KHRzRG91Z2xhc05FLCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBEb3VnbGFzLCBORSIpCiMgSGFsbApORV9IYWxsIDwtIHRyYWluICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIk5lYnJhc2thIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIkhhbGwiKQp0c0hhbGxORSA8LSB0cyhORV9IYWxsWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c0hhbGxORSwgbWFpbiA9ICJDT1ZJRC0xOSBDYXNlcyBhbmQgRGVhdGhzIC0gSGFsbCwgTkUiKQojIFNjb3R0cyBCbHVmZgpORV9TY290dHMgPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiTmVicmFza2EiKSAlPiUgZmlsdGVyKENvdW50eSA9PSAiU2NvdHRzIEJsdWZmIikKdHNTY290dHNORSA8LSB0cyhORV9TY290dHNbLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KHRzU2NvdHRzTkUsIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIFNjb3R0cyBCbHVmZiwgTkUiKQoKIyBmaWx0ZXIgdG8gUEEgY291bnRpZXMKIyBCdWNrcwpQQV9CdWNrcyA8LSB0cmFpbiAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJQZW5uc3lsdmFuaWEiKSAlPiUgZmlsdGVyKENvdW50eSA9PSAiQnVja3MiKQp0c0J1Y2tzUEEgPC0gdHMoUEFfQnVja3NbLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KHRzQnVja3NQQSwgbWFpbiA9ICJDT1ZJRC0xOSBDYXNlcyBhbmQgRGVhdGhzIC0gQnVja3MsIFBBIikKIyBNb250Z29tZXJ5ClBBX01vbnRnb21lcnkgPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiUGVubnN5bHZhbmlhIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIk1vbnRnb21lcnkiKQp0c01vbnRnb21lcnlQQSA8LSB0cyhQQV9Nb250Z29tZXJ5WywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c01vbnRnb21lcnlQQSwgbWFpbiA9ICJDT1ZJRC0xOSBDYXNlcyBhbmQgRGVhdGhzIC0gTW9udGdvbWVyeSwgUEEiKQojIFBoaWxhZGVscGhpYQpQQV9QaGlsYWRlbHBoaWEgPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiUGVubnN5bHZhbmlhIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIlBoaWxhZGVscGhpYSIpCnRzUGhpbGFkZWxwaGlhUEEgPC0gdHMoUEFfUGhpbGFkZWxwaGlhWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c1BoaWxhZGVscGhpYVBBLCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBQaGlsYWRlbHBoaWEsIFBBIikKCiMgZmlsdGVyIHRvIFNEIGNvdW50aWVzCiMgQnJvd24KU0RfQnJvd24gPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiU291dGggRGFrb3RhIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIkJyb3duIikKdHNCcm93blNEIDwtIHRzKFNEX0Jyb3duWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c0Jyb3duU0QsIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIEJyb3duLCBTRCIpCiMgTWlubmVoYWhhClNEX01pbm5laGFoYSA8LSB0cmFpbiAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJTb3V0aCBEYWtvdGEiKSAlPiUgZmlsdGVyKENvdW50eSA9PSAiTWlubmVoYWhhIikKdHNNaW5uZWhhaGFTRCA8LSB0cyhTRF9NaW5uZWhhaGFbLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KHRzTWlubmVoYWhhU0QsIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIE1pbm5laGFoYSwgU0QiKQoKIyBmaWx0ZXIgdG8gVFggY291bnRpZXMKIyBEYWxsYXMKVFhfRGFsbGFzIDwtIHRyYWluICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIlRleGFzIikgJT4lIGZpbHRlcihDb3VudHkgPT0gIkRhbGxhcyIpCnRzRGFsbGFzVFggPC0gdHMoVFhfRGFsbGFzWywgNjo3XSwgc3RhcnQgPSBjKDIwMjAsIDIzKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdCh0c0RhbGxhc1RYLCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBEYWxsYXMsIFRYIikKIyBFbGxpcwpUWF9FbGxpcyA8LSB0cmFpbiAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJUZXhhcyIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICJFbGxpcyIpCnRzRWxsaXNUWCA8LSB0cyhUWF9FbGxpc1ssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNFbGxpc1RYLCBtYWluID0gIkNPVklELTE5IENhc2VzIGFuZCBEZWF0aHMgLSBFbGxpcywgVFgiKQojIEhhcnJpcwpUWF9IYXJyaXMgPC0gdHJhaW4gJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiVGV4YXMiKSAlPiUgZmlsdGVyKENvdW50eSA9PSAiSGFycmlzIikKdHNIYXJyaXNUWCA8LSB0cyhUWF9IYXJyaXNbLCA2OjddLCBzdGFydCA9IGMoMjAyMCwgMjMpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KHRzSGFycmlzVFgsIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIEhhcnJpcywgVFgiKQojIFRhcnJhbnQKVFhfVGFycmFudCA8LSB0cmFpbiAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJUZXhhcyIpICU+JSBmaWx0ZXIoQ291bnR5ID09ICJUYXJyYW50IikKdHNUYXJyYW50VFggPC0gdHMoVFhfVGFycmFudFssIDY6N10sIHN0YXJ0ID0gYygyMDIwLCAyMyksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QodHNUYXJyYW50VFgsIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIFRhcnJhbnQsIFRYIikKCiMgQnVpbGQgbW9kZWxzIGZvciBDTyBDb3VudGllcwojIEFkYW1zCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c0FkYW1zQ08pCkFkYW1zX2Nhc2VzIDwtIHRzQWRhbXNDT1ssICJDYXNlcyJdCkFkYW1zX2Nhc2VzX3RyYWluIDwtIEFkYW1zX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpBZGFtc19jYXNlc190ZXN0IDwtIEFkYW1zX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpBZGFtc19kZWF0aHMgPC0gdHNBZGFtc0NPWywgIkRlYXRocyJdCkFkYW1zX2RlYXRoc190cmFpbiA8LSBBZGFtc19kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCkFkYW1zX2RlYXRoc190ZXN0IDwtIEFkYW1zX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X0FkYW1zX2Nhc2VzIDwtIGF1dG8uYXJpbWEoQWRhbXNfY2FzZXMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0FkYW1zX2Nhc2VzICMgQVJJTUEoNCwgMSwgMSksIEFJQ2MgLSA5MzYuMTgKYXV0b3Bsb3QoZml0X0FkYW1zX2Nhc2VzKQpzYXJpbWEuZm9yKEFkYW1zX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDQsIDEsIDEpCmxpbmVzKEFkYW1zX2Nhc2VzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9BZGFtc19jYXNlcykgIyBwYXNzZXMgTGp1bmcgQm94IHRlc3QKZml0X0FkYW1zX2RlYXRocyA8LSBhdXRvLmFyaW1hKEFkYW1zX2RlYXRocywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfQWRhbXNfZGVhdGhzICMgQVJJTUEoMiwgMSwgMyksIEFJQ2MgLSA0MTQuNjEKYXV0b3Bsb3QoZml0X0FkYW1zX2RlYXRocykKc2FyaW1hLmZvcihBZGFtc19kZWF0aHNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMiwgMSwgMykKbGluZXMoQWRhbXNfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9BZGFtc19kZWF0aHMpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfQWRhbXMgPC0gc2FyaW1hLmZvcihBZGFtc19jYXNlcywgbi5haGVhZCA9IDEwLCA0LCAxLCAxKQpmY18xMF9BZGFtcyRwcmVkCmZjZF8xMF9BZGFtcyA8LSBzYXJpbWEuZm9yKEFkYW1zX2RlYXRocywgbi5haGVhZCA9IDEwLCAyLCAxLCAzKSAKZmNkXzEwX0FkYW1zJHByZWQKIyBBcmFwYWhvZQojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMKYXV0b3Bsb3QodHNBcmFwYWhvZUNPKQpBcmFwYWhvZV9jYXNlcyA8LSB0c0FyYXBhaG9lQ09bLCAiQ2FzZXMiXQpBcmFwYWhvZV9jYXNlc190cmFpbiA8LSBBcmFwYWhvZV9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKQXJhcGFob2VfY2FzZXNfdGVzdCA8LSBBcmFwYWhvZV9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKQXJhcGFob2VfZGVhdGhzIDwtIHRzQXJhcGFob2VDT1ssICJEZWF0aHMiXQpBcmFwYWhvZV9kZWF0aHNfdHJhaW4gPC0gQXJhcGFob2VfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpBcmFwYWhvZV9kZWF0aHNfdGVzdCA8LSBBcmFwYWhvZV9kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9BcmFwYWhvZV9jYXNlcyA8LSBhdXRvLmFyaW1hKEFyYXBhaG9lX2Nhc2VzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9BcmFwYWhvZV9jYXNlcyAjIEFSSU1BKDUsIDEsIDApLCBBSUNjIC0gOTkxLjk0CmF1dG9wbG90KGZpdF9BcmFwYWhvZV9jYXNlcykKc2FyaW1hLmZvcihBcmFwYWhvZV9jYXNlc190cmFpbiwgbi5haGVhZCA9IDIwLCA1LCAxLCAwKQpsaW5lcyhBcmFwYWhvZV9jYXNlc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfQXJhcGFob2VfY2FzZXMpICMgcGFzc2VzCmZpdF9BcmFwYWhvZV9kZWF0aHMgPC0gYXV0by5hcmltYShBcmFwYWhvZV9kZWF0aHMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0FyYXBhaG9lX2RlYXRocyAjIEFSSU1BKDAsIDEsIDEpLCBBSUNjIC0gNTU0LjM5CmF1dG9wbG90KGZpdF9BcmFwYWhvZV9kZWF0aHMpCnNhcmltYS5mb3IoQXJhcGFob2VfZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDAsIDEsIDEpCmxpbmVzKEFyYXBhaG9lX2RlYXRoc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfQXJhcGFob2VfZGVhdGhzKSAjIHBhc3NlcwojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX0FyYXBhaG9lIDwtIHNhcmltYS5mb3IoQXJhcGFob2VfY2FzZXMsIG4uYWhlYWQgPSAxMCwgNSwgMSwgMCkKZmNfMTBfQXJhcGFob2UkcHJlZApmY2RfMTBfQXJhcGFob2UgPC0gc2FyaW1hLmZvcihBcmFwYWhvZV9kZWF0aHMsIG4uYWhlYWQgPSAxMCwgMCwgMSwgMSkgCmZjZF8xMF9BcmFwYWhvZSRwcmVkCiMgQm91bGRlcgojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMKYXV0b3Bsb3QodHNCb3VsZGVyQ08pCkJvdWxkZXJfY2FzZXMgPC0gdHNCb3VsZGVyQ09bLCAiQ2FzZXMiXQpCb3VsZGVyX2Nhc2VzX3RyYWluIDwtIEJvdWxkZXJfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCkJvdWxkZXJfY2FzZXNfdGVzdCA8LSBCb3VsZGVyX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpCb3VsZGVyX2RlYXRocyA8LSB0c0JvdWxkZXJDT1ssICJEZWF0aHMiXQpCb3VsZGVyX2RlYXRoc190cmFpbiA8LSBCb3VsZGVyX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKQm91bGRlcl9kZWF0aHNfdGVzdCA8LSBCb3VsZGVyX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X0JvdWxkZXJfY2FzZXMgPC0gYXV0by5hcmltYShCb3VsZGVyX2Nhc2VzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9Cb3VsZGVyX2Nhc2VzICMgQVJJTUEoMCwgMSwgNSksIEFJQ2MgLSA3MzMuOQphdXRvcGxvdChmaXRfQm91bGRlcl9jYXNlcykKc2FyaW1hLmZvcihCb3VsZGVyX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDAsIDEsIDUpCmxpbmVzKEJvdWxkZXJfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X0JvdWxkZXJfY2FzZXMpICMgcGFzc2VzCmZpdF9Cb3VsZGVyX2RlYXRocyA8LSBhdXRvLmFyaW1hKEJvdWxkZXJfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9Cb3VsZGVyX2RlYXRocyAjIEFSSU1BKDAsIDEsIDEpLCBBSUNjIC0gMjk5LjkxCmF1dG9wbG90KGZpdF9Cb3VsZGVyX2RlYXRocykKc2FyaW1hLmZvcihCb3VsZGVyX2RlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCAwLCAxLCAxKQpsaW5lcyhCb3VsZGVyX2RlYXRoc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfQm91bGRlcl9kZWF0aHMpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfQm91bGRlciA8LSBzYXJpbWEuZm9yKEJvdWxkZXJfY2FzZXMsIG4uYWhlYWQgPSAxMCwgMCwgMSwgNSkKZmNfMTBfQm91bGRlciRwcmVkCmZjZF8xMF9Cb3VsZGVyIDwtIHNhcmltYS5mb3IoQm91bGRlcl9kZWF0aHMsIG4uYWhlYWQgPSAxMCwgMCwgMSwgMSkgCmZjZF8xMF9Cb3VsZGVyJHByZWQKIyBEZW52ZXIKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KHRzRGVudmVyQ08pCkRlbnZlcl9jYXNlcyA8LSB0c0RlbnZlckNPWywgIkNhc2VzIl0KRGVudmVyX2Nhc2VzX3RyYWluIDwtIERlbnZlcl9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKRGVudmVyX2Nhc2VzX3Rlc3QgPC0gRGVudmVyX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpEZW52ZXJfZGVhdGhzIDwtIHRzRGVudmVyQ09bLCAiRGVhdGhzIl0KRGVudmVyX2RlYXRoc190cmFpbiA8LSBEZW52ZXJfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpEZW52ZXJfZGVhdGhzX3Rlc3QgPC0gRGVudmVyX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X0RlbnZlcl9jYXNlcyA8LSBhdXRvLmFyaW1hKERlbnZlcl9jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfRGVudmVyX2Nhc2VzICMgQVJJTUEoNCwgMSwgMSksIEFJQ2MgLSAxMDM2LjY4CmF1dG9wbG90KGZpdF9EZW52ZXJfY2FzZXMpCnNhcmltYS5mb3IoRGVudmVyX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDQsIDEsIDEpCmxpbmVzKERlbnZlcl9jYXNlc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfRGVudmVyX2Nhc2VzKSAjIHBhc3NlcwpmaXRfRGVudmVyX2RlYXRocyA8LSBhdXRvLmFyaW1hKERlbnZlcl9kZWF0aHMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0RlbnZlcl9kZWF0aHMgIyBBUklNQSgxLCAxLCAzKSwgQUlDYyAtIDYwMS41NgphdXRvcGxvdChmaXRfRGVudmVyX2RlYXRocykKc2FyaW1hLmZvcihEZW52ZXJfZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDEsIDEsIDMpCmxpbmVzKERlbnZlcl9kZWF0aHNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X0RlbnZlcl9kZWF0aHMpICMgZG9lcyBub3QgcGFzcwpmaXRfRGVudmVyX2RlYXRoczIgPC0gYXJpbWEoRGVudmVyX2RlYXRocywgb3JkZXIgPSBjKDEwLCAxLCAzKSkKY2hlY2tyZXNpZHVhbHMoZml0X0RlbnZlcl9kZWF0aHMyKSAjIHBhc3NlcwojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX0RlbnZlciA8LSBzYXJpbWEuZm9yKERlbnZlcl9jYXNlcywgbi5haGVhZCA9IDEwLCA0LCAxLCAxKQpmY18xMF9EZW52ZXIkcHJlZApmY2RfMTBfRGVudmVyIDwtIHNhcmltYS5mb3IoRGVudmVyX2RlYXRocywgbi5haGVhZCA9IDEwLCAxMCwgMSwgMykgCmZjZF8xMF9EZW52ZXIkcHJlZAojIERvdWdsYXMKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KHRzRG91Z2xhc0NPKQpEb3VnbGFzX2Nhc2VzIDwtIHRzRG91Z2xhc0NPWywgIkNhc2VzIl0KRG91Z2xhc19jYXNlc190cmFpbiA8LSBEb3VnbGFzX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpEb3VnbGFzX2Nhc2VzX3Rlc3QgPC0gRG91Z2xhc19jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKRG91Z2xhc19kZWF0aHMgPC0gdHNEb3VnbGFzQ09bLCAiRGVhdGhzIl0KRG91Z2xhc19kZWF0aHNfdHJhaW4gPC0gRG91Z2xhc19kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCkRvdWdsYXNfZGVhdGhzX3Rlc3QgPC0gRG91Z2xhc19kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9Eb3VnbGFzX2Nhc2VzIDwtIGF1dG8uYXJpbWEoRG91Z2xhc19jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfRG91Z2xhc19jYXNlcyAjIEFSSU1BKDQsIDEsIDEpLCBBSUNjIC0gNjg5LjA3CmF1dG9wbG90KGZpdF9Eb3VnbGFzX2Nhc2VzKQpzYXJpbWEuZm9yKERvdWdsYXNfY2FzZXNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgNCwgMSwgMSkKbGluZXMoRG91Z2xhc19jYXNlc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfRG91Z2xhc19jYXNlcykgIyBkb2VzIG5vdCBwYXNzCmZpdF9Eb3VnbGFzX2Nhc2VzMiA8LSBhcmltYShEb3VnbGFzX2Nhc2VzLCBvcmRlciA9IGMoNCwgMSwgNikpCmNoZWNrcmVzaWR1YWxzKGZpdF9Eb3VnbGFzX2Nhc2VzMikgIyBwYXNzZXMKZml0X0RvdWdsYXNfZGVhdGhzIDwtIGF1dG8uYXJpbWEoRG91Z2xhc19kZWF0aHMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0RvdWdsYXNfZGVhdGhzICMgQVJJTUEoMiwgMSwgMyksIEFJQ2MgLSAyMDEuNzgKYXV0b3Bsb3QoZml0X0RvdWdsYXNfZGVhdGhzKQpzYXJpbWEuZm9yKERvdWdsYXNfZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDIsIDEsIDMpCmxpbmVzKERvdWdsYXNfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9Eb3VnbGFzX2RlYXRocykgIyBkb2VzIG5vdCBwYXNzCmZpdF9Eb3VnbGFzX2RlYXRoczIgPC0gYXJpbWEoRG91Z2xhc19kZWF0aHMsIG9yZGVyID0gYyg4LCAxLCA0KSkKY2hlY2tyZXNpZHVhbHMoZml0X0RvdWdsYXNfZGVhdGhzMikgIyBwYXNzZXMKIyBVc2UgYmVzdCBtb2RlbHMgdG8gZm9yZWNhc3QgZnVydGhlciBhaGVhZApmY18xMF9Eb3VnbGFzIDwtIHNhcmltYS5mb3IoRG91Z2xhc19jYXNlcywgbi5haGVhZCA9IDEwLCA0LCAxLCA2KQpmY18xMF9Eb3VnbGFzJHByZWQKZmNkXzEwX0RvdWdsYXMgPC0gc2FyaW1hLmZvcihEb3VnbGFzX2RlYXRocywgbi5haGVhZCA9IDEwLCA4LCAxLCA0KSAKZmNkXzEwX0RvdWdsYXMkcHJlZAojIEVsIFBhc28KIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KHRzRWxQYXNvQ08pCkVsUGFzb19jYXNlcyA8LSB0c0VsUGFzb0NPWywgIkNhc2VzIl0KRWxQYXNvX2Nhc2VzX3RyYWluIDwtIEVsUGFzb19jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKRWxQYXNvX2Nhc2VzX3Rlc3QgPC0gRWxQYXNvX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpFbFBhc29fZGVhdGhzIDwtIHRzRWxQYXNvQ09bLCAiRGVhdGhzIl0KRWxQYXNvX2RlYXRoc190cmFpbiA8LSBFbFBhc29fZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpFbFBhc29fZGVhdGhzX3Rlc3QgPC0gRWxQYXNvX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X0VsUGFzb19jYXNlcyA8LSBhdXRvLmFyaW1hKEVsUGFzb19jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfRWxQYXNvX2Nhc2VzICMgQVJJTUEoMCwgMSwgNSksIEFJQ2MgLSA4NDguMjQKYXV0b3Bsb3QoZml0X0VsUGFzb19jYXNlcykKc2FyaW1hLmZvcihFbFBhc29fY2FzZXNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMCwgMSwgNSkKbGluZXMoRWxQYXNvX2Nhc2VzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9FbFBhc29fY2FzZXMpICMgZG9lcyBub3QgcGFzcwpmaXRfRWxQYXNvX2Nhc2VzMiA8LSBhcmltYShFbFBhc29fY2FzZXMsIG9yZGVyID0gYyg2LCAxLCAxMCkpCmNoZWNrcmVzaWR1YWxzKGZpdF9FbFBhc29fY2FzZXMyKSAjIHBhc3NlcwpmaXRfRWxQYXNvX2RlYXRocyA8LSBhdXRvLmFyaW1hKEVsUGFzb19kZWF0aHMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0VsUGFzb19kZWF0aHMgIyBBUklNQSgwLCAxLCAxKSwgQUlDYyAtIDQ1Ny4yOAphdXRvcGxvdChmaXRfRWxQYXNvX2RlYXRocykKc2FyaW1hLmZvcihFbFBhc29fZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDAsIDEsIDEpCmxpbmVzKEVsUGFzb19kZWF0aHNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X0VsUGFzb19kZWF0aHMpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfRWxQYXNvIDwtIHNhcmltYS5mb3IoRWxQYXNvX2Nhc2VzLCBuLmFoZWFkID0gMTAsIDYsIDEsIDEwKQpmY18xMF9FbFBhc28kcHJlZApmY2RfMTBfRWxQYXNvIDwtIHNhcmltYS5mb3IoRWxQYXNvX2RlYXRocywgbi5haGVhZCA9IDEwLCAwLCAxLCAxKSAKZmNkXzEwX0VsUGFzbyRwcmVkCiMgSmVmZmVyc29uCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c0plZmZlcnNvbkNPKQpKZWZmZXJzb25fY2FzZXMgPC0gdHNKZWZmZXJzb25DT1ssICJDYXNlcyJdCkplZmZlcnNvbl9jYXNlc190cmFpbiA8LSBKZWZmZXJzb25fY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCkplZmZlcnNvbl9jYXNlc190ZXN0IDwtIEplZmZlcnNvbl9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKSmVmZmVyc29uX2RlYXRocyA8LSB0c0plZmZlcnNvbkNPWywgIkRlYXRocyJdCkplZmZlcnNvbl9kZWF0aHNfdHJhaW4gPC0gSmVmZmVyc29uX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKSmVmZmVyc29uX2RlYXRoc190ZXN0IDwtIEplZmZlcnNvbl9kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9KZWZmZXJzb25fY2FzZXMgPC0gYXV0by5hcmltYShKZWZmZXJzb25fY2FzZXMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0plZmZlcnNvbl9jYXNlcyAjIEFSSU1BKDIsIDEsIDMpLCBBSUNjIC0gOTE2LjgyCmF1dG9wbG90KGZpdF9KZWZmZXJzb25fY2FzZXMpCnNhcmltYS5mb3IoSmVmZmVyc29uX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDIsIDEsIDMpCmxpbmVzKEplZmZlcnNvbl9jYXNlc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfSmVmZmVyc29uX2Nhc2VzKSAjIHBhc3NlcwpmaXRfSmVmZmVyc29uX2RlYXRocyA8LSBhdXRvLmFyaW1hKEplZmZlcnNvbl9kZWF0aHMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0plZmZlcnNvbl9kZWF0aHMgIyBBUklNQSgwLCAxLCAxKSwgQUlDYyAtIDQwMi40NQphdXRvcGxvdChmaXRfSmVmZmVyc29uX2RlYXRocykKc2FyaW1hLmZvcihKZWZmZXJzb25fZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDAsIDEsIDEpCmxpbmVzKEplZmZlcnNvbl9kZWF0aHNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X0plZmZlcnNvbl9kZWF0aHMpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfSmVmZmVyc29uIDwtIHNhcmltYS5mb3IoSmVmZmVyc29uX2Nhc2VzLCBuLmFoZWFkID0gMTAsIDIsIDEsIDMpCmZjXzEwX0plZmZlcnNvbiRwcmVkCmZjZF8xMF9KZWZmZXJzb24gPC0gc2FyaW1hLmZvcihKZWZmZXJzb25fZGVhdGhzLCBuLmFoZWFkID0gMTAsIDAsIDEsIDEpIApmY2RfMTBfSmVmZmVyc29uJHByZWQKIyBXZWxkCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c1dlbGRDTykKV2VsZF9jYXNlcyA8LSB0c1dlbGRDT1ssICJDYXNlcyJdCldlbGRfY2FzZXNfdHJhaW4gPC0gV2VsZF9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKV2VsZF9jYXNlc190ZXN0IDwtIFdlbGRfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCldlbGRfZGVhdGhzIDwtIHRzV2VsZENPWywgIkRlYXRocyJdCldlbGRfZGVhdGhzX3RyYWluIDwtIFdlbGRfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpXZWxkX2RlYXRoc190ZXN0IDwtIFdlbGRfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfV2VsZF9jYXNlcyA8LSBhdXRvLmFyaW1hKFdlbGRfY2FzZXMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X1dlbGRfY2FzZXMgIyBBUklNQSgyLCAxLCAzKSwgQUlDYyAtIDkzNC4zNQphdXRvcGxvdChmaXRfV2VsZF9jYXNlcykKc2FyaW1hLmZvcihXZWxkX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDIsIDEsIDMpCmxpbmVzKFdlbGRfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X1dlbGRfY2FzZXMpICMgZG9lcyBub3QgcGFzcwpmaXRfV2VsZF9jYXNlczIgPC0gYXJpbWEoV2VsZF9jYXNlcywgb3JkZXIgPSBjKDIsIDEsIDUpKQpjaGVja3Jlc2lkdWFscyhmaXRfV2VsZF9jYXNlczIpICMgcGFzc2VzCmZpdF9XZWxkX2RlYXRocyA8LSBhdXRvLmFyaW1hKFdlbGRfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9XZWxkX2RlYXRocyAjIEFSSU1BKDQsIDEsIDEpLCBBSUNjIC0gNDQ3LjEyCmF1dG9wbG90KGZpdF9XZWxkX2RlYXRocykKc2FyaW1hLmZvcihXZWxkX2RlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCA0LCAxLCAxKQpsaW5lcyhXZWxkX2RlYXRoc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfV2VsZF9kZWF0aHMpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfV2VsZCA8LSBzYXJpbWEuZm9yKFdlbGRfY2FzZXMsIG4uYWhlYWQgPSAxMCwgMiwgMSwgNSkKZmNfMTBfV2VsZCRwcmVkCmZjZF8xMF9XZWxkIDwtIHNhcmltYS5mb3IoV2VsZF9kZWF0aHMsIG4uYWhlYWQgPSAxMCwgNCwgMSwgMSkgCmZjZF8xMF9XZWxkJHByZWQKCiMgUmVwZWF0IGZvciBNSSBDb3VudGllcwojIE1vbnJvZQojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMKYXV0b3Bsb3QodHNNb25yb2VNSSkKTW9ucm9lX2Nhc2VzIDwtIHRzTW9ucm9lTUlbLCAiQ2FzZXMiXQpNb25yb2VfY2FzZXNfdHJhaW4gPC0gTW9ucm9lX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpNb25yb2VfY2FzZXNfdGVzdCA8LSBNb25yb2VfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCk1vbnJvZV9kZWF0aHMgPC0gdHNNb25yb2VNSVssICJEZWF0aHMiXQpNb25yb2VfZGVhdGhzX3RyYWluIDwtIE1vbnJvZV9kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCk1vbnJvZV9kZWF0aHNfdGVzdCA8LSBNb25yb2VfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfTW9ucm9lX2Nhc2VzIDwtIGF1dG8uYXJpbWEoTW9ucm9lX2Nhc2VzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9Nb25yb2VfY2FzZXMgIyBBUklNQSgzLCAxLCAyKSwgQUlDYyAtIDU3NS4xMwphdXRvcGxvdChmaXRfTW9ucm9lX2Nhc2VzKQpzYXJpbWEuZm9yKE1vbnJvZV9jYXNlc190cmFpbiwgbi5haGVhZCA9IDIwLCAzLCAxLCAyKQpsaW5lcyhNb25yb2VfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X01vbnJvZV9jYXNlcykgIyBwYXNzZXMgTGp1bmcgQm94IHRlc3QKZml0X01vbnJvZV9kZWF0aHMgPC0gYXV0by5hcmltYShNb25yb2VfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9Nb25yb2VfZGVhdGhzICMgQVJJTUEoMiwgMSwgMSksIEFJQ2MgLSAxMDUuNTUKYXV0b3Bsb3QoZml0X01vbnJvZV9kZWF0aHMpCnNhcmltYS5mb3IoTW9ucm9lX2RlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCAyLCAxLCAxKQpsaW5lcyhNb25yb2VfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9Nb25yb2VfZGVhdGhzKSAjIHBhc3NlcwojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX01vbnJvZSA8LSBzYXJpbWEuZm9yKE1vbnJvZV9jYXNlcywgbi5haGVhZCA9IDEwLCAzLCAxLCAyKQpmY18xMF9Nb25yb2UkcHJlZApmY2RfMTBfTW9ucm9lIDwtIHNhcmltYS5mb3IoTW9ucm9lX2RlYXRocywgbi5haGVhZCA9IDEwLCAyLCAxLCAxKSAKZmNkXzEwX01vbnJvZSRwcmVkCiMgTWFjb21iCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c01hY29tYk1JKQpNYWNvbWJfY2FzZXMgPC0gdHNNYWNvbWJNSVssICJDYXNlcyJdCk1hY29tYl9jYXNlc190cmFpbiA8LSBNYWNvbWJfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCk1hY29tYl9jYXNlc190ZXN0IDwtIE1hY29tYl9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKTWFjb21iX2RlYXRocyA8LSB0c01hY29tYk1JWywgIkRlYXRocyJdCk1hY29tYl9kZWF0aHNfdHJhaW4gPC0gTWFjb21iX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKTWFjb21iX2RlYXRoc190ZXN0IDwtIE1hY29tYl9kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9NYWNvbWJfY2FzZXMgPC0gYXV0by5hcmltYShNYWNvbWJfY2FzZXMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X01hY29tYl9jYXNlcyAjIEFSSU1BKDIsIDEsIDMpLCBBSUNjIC0gMTA1OC41OAphdXRvcGxvdChmaXRfTWFjb21iX2Nhc2VzKQpzYXJpbWEuZm9yKE1hY29tYl9jYXNlc190cmFpbiwgbi5haGVhZCA9IDIwLCAyLCAxLCAzKQpsaW5lcyhNYWNvbWJfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X01hY29tYl9jYXNlcykgIyBkb2VzIG5vdCBwYXNzCmZpdF9NYWNvbWJfY2FzZXMyIDwtIGFyaW1hKE1hY29tYl9jYXNlcywgb3JkZXIgPSBjKDUsIDEsIDkpKQpjaGVja3Jlc2lkdWFscyhmaXRfTWFjb21iX2Nhc2VzMikgIyBwYXNzZXMKZml0X01hY29tYl9kZWF0aHMgPC0gYXV0by5hcmltYShNYWNvbWJfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9NYWNvbWJfZGVhdGhzICMgQVJJTUEoNSwgMSwgMCksIEFJQ2MgLSA3MTMuOAphdXRvcGxvdChmaXRfTWFjb21iX2RlYXRocykKc2FyaW1hLmZvcihNYWNvbWJfZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDUsIDEsIDApCmxpbmVzKE1hY29tYl9kZWF0aHNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X01hY29tYl9kZWF0aHMpICMgZG9lcyBub3QgcGFzcwpmaXRfTWFjb21iX2RlYXRoczIgPC0gYXJpbWEoTWFjb21iX2RlYXRocywgb3JkZXIgPSBjKDUsIDEsIDQpKQpjaGVja3Jlc2lkdWFscyhmaXRfTWFjb21iX2RlYXRoczIpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfTWFjb21iIDwtIHNhcmltYS5mb3IoTWFjb21iX2Nhc2VzLCBuLmFoZWFkID0gMTAsIDUsIDEsIDkpCmZjXzEwX01hY29tYiRwcmVkCmZjZF8xMF9NYWNvbWIgPC0gc2FyaW1hLmZvcihNYWNvbWJfZGVhdGhzLCBuLmFoZWFkID0gMTAsIDUsIDEsIDQpIApmY2RfMTBfTWFjb21iJHByZWQKIyBPYWtsYW5kCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c09ha2xhbmRNSSkKT2FrbGFuZF9jYXNlcyA8LSB0c09ha2xhbmRNSVssICJDYXNlcyJdCk9ha2xhbmRfY2FzZXNfdHJhaW4gPC0gT2FrbGFuZF9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKT2FrbGFuZF9jYXNlc190ZXN0IDwtIE9ha2xhbmRfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCk9ha2xhbmRfZGVhdGhzIDwtIHRzT2FrbGFuZE1JWywgIkRlYXRocyJdCk9ha2xhbmRfZGVhdGhzX3RyYWluIDwtIE9ha2xhbmRfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpPYWtsYW5kX2RlYXRoc190ZXN0IDwtIE9ha2xhbmRfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfT2FrbGFuZF9jYXNlcyA8LSBhdXRvLmFyaW1hKE9ha2xhbmRfY2FzZXMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X09ha2xhbmRfY2FzZXMgIyBBUklNQSgwLCAxLCA1KSwgQUlDYyAtIDEwODYuMDkKYXV0b3Bsb3QoZml0X09ha2xhbmRfY2FzZXMpCnNhcmltYS5mb3IoT2FrbGFuZF9jYXNlc190cmFpbiwgbi5haGVhZCA9IDIwLCAwLCAxLCA1KQpsaW5lcyhPYWtsYW5kX2Nhc2VzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9PYWtsYW5kX2Nhc2VzKSAjIGRvZXMgbm90IHBhc3MKZml0X09ha2xhbmRfY2FzZXMyIDwtIGFyaW1hKE9ha2xhbmRfY2FzZXMsIG9yZGVyID0gYyg2LCAxLCA4KSkKY2hlY2tyZXNpZHVhbHMoZml0X09ha2xhbmRfY2FzZXMyKSAjIHBhc3NlcwpmaXRfT2FrbGFuZF9kZWF0aHMgPC0gYXV0by5hcmltYShPYWtsYW5kX2RlYXRocywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfT2FrbGFuZF9kZWF0aHMgIyBBUklNQSgzLCAxLCAyKSwgQUlDYyAtIDcwNC4zNgphdXRvcGxvdChmaXRfT2FrbGFuZF9kZWF0aHMpCnNhcmltYS5mb3IoT2FrbGFuZF9kZWF0aHNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMywgMSwgMikKbGluZXMoT2FrbGFuZF9kZWF0aHNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X09ha2xhbmRfZGVhdGhzKSAjIGRvZXMgbm90IHBhc3MKZml0X09ha2xhbmRfZGVhdGhzMiA8LSBhcmltYShPYWtsYW5kX2RlYXRocywgb3JkZXIgPSBjKDQsIDIsIDMpKQpjaGVja3Jlc2lkdWFscyhmaXRfT2FrbGFuZF9kZWF0aHMyKSAjIHBhc3NlcwojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX09ha2xhbmQgPC0gc2FyaW1hLmZvcihPYWtsYW5kX2Nhc2VzLCBuLmFoZWFkID0gMTAsIDYsIDEsIDgpCmZjXzEwX09ha2xhbmQkcHJlZApmY2RfMTBfT2FrbGFuZCA8LSBzYXJpbWEuZm9yKE9ha2xhbmRfZGVhdGhzLCBuLmFoZWFkID0gMTAsIDQsIDIsIDMpIApmY2RfMTBfT2FrbGFuZCRwcmVkCiMgV2F5bmUKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KHRzV2F5bmVNSSkKV2F5bmVfY2FzZXMgPC0gdHNXYXluZU1JWywgIkNhc2VzIl0KV2F5bmVfY2FzZXNfdHJhaW4gPC0gV2F5bmVfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCldheW5lX2Nhc2VzX3Rlc3QgPC0gV2F5bmVfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCldheW5lX2RlYXRocyA8LSB0c1dheW5lTUlbLCAiRGVhdGhzIl0KV2F5bmVfZGVhdGhzX3RyYWluIDwtIFdheW5lX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKV2F5bmVfZGVhdGhzX3Rlc3QgPC0gV2F5bmVfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfV2F5bmVfY2FzZXMgPC0gYXV0by5hcmltYShXYXluZV9jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfV2F5bmVfY2FzZXMgIyBBUklNQSgxLCAxLCAyKSwgQUlDYyAtIDEzNDQuOTMKYXV0b3Bsb3QoZml0X1dheW5lX2Nhc2VzKQpzYXJpbWEuZm9yKFdheW5lX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDEsIDEsIDIpCmxpbmVzKFdheW5lX2Nhc2VzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9XYXluZV9jYXNlcykgIyBwYXNzZXMKZml0X1dheW5lX2RlYXRocyA8LSBhdXRvLmFyaW1hKFdheW5lX2RlYXRocywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfV2F5bmVfZGVhdGhzICMgQVJJTUEoMCwgMSwgNSksIEFJQ2MgLSA5NzEuNjIKYXV0b3Bsb3QoZml0X1dheW5lX2RlYXRocykKc2FyaW1hLmZvcihXYXluZV9kZWF0aHNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMCwgMSwgNSkKbGluZXMoV2F5bmVfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9XYXluZV9kZWF0aHMpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfV2F5bmUgPC0gc2FyaW1hLmZvcihXYXluZV9jYXNlcywgbi5haGVhZCA9IDEwLCAxLCAxLCAyKQpmY18xMF9XYXluZSRwcmVkCmZjZF8xMF9XYXluZSA8LSBzYXJpbWEuZm9yKFdheW5lX2RlYXRocywgbi5haGVhZCA9IDEwLCAwLCAxLCA1KSAKZmNkXzEwX1dheW5lJHByZWQKCiMgUmVwZWF0IGZvciBNTiBDb3VudGllcwojIEFub2thCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c0Fub2thTU4pCkFub2thX2Nhc2VzIDwtIHRzQW5va2FNTlssICJDYXNlcyJdCkFub2thX2Nhc2VzX3RyYWluIDwtIEFub2thX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpBbm9rYV9jYXNlc190ZXN0IDwtIEFub2thX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpBbm9rYV9kZWF0aHMgPC0gdHNBbm9rYU1OWywgIkRlYXRocyJdCkFub2thX2RlYXRoc190cmFpbiA8LSBBbm9rYV9kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCkFub2thX2RlYXRoc190ZXN0IDwtIEFub2thX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X0Fub2thX2Nhc2VzIDwtIGF1dG8uYXJpbWEoQW5va2FfY2FzZXMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0Fub2thX2Nhc2VzICMgQVJJTUEoMiwgMSwgMyksIEFJQ2MgLSA2MTQuMTEKYXV0b3Bsb3QoZml0X0Fub2thX2Nhc2VzKQpzYXJpbWEuZm9yKEFub2thX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDIsIDEsIDMpICMgZXJyb3I/IT8KY2hlY2tyZXNpZHVhbHMoZml0X0Fub2thX2Nhc2VzKSAjIHBhc3NlcyBManVuZyBCb3ggdGVzdApmaXRfQW5va2FfZGVhdGhzIDwtIGF1dG8uYXJpbWEoQW5va2FfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9Bbm9rYV9kZWF0aHMgIyBBUklNQSg0LCAxLCAxKSwgQUlDYyAtIDE2Mi45NAphdXRvcGxvdChmaXRfQW5va2FfZGVhdGhzKQpzYXJpbWEuZm9yKEFub2thX2RlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCA0LCAxLCAxKSAjIGVycm9yPyE/CmNoZWNrcmVzaWR1YWxzKGZpdF9Bbm9rYV9kZWF0aHMpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfQW5va2EgPC0gc2FyaW1hLmZvcihBbm9rYV9jYXNlcywgbi5haGVhZCA9IDEwLCAyLCAxLCAzKQpmY18xMF9Bbm9rYSRwcmVkCmZjZF8xMF9Bbm9rYSA8LSBzYXJpbWEuZm9yKEFub2thX2RlYXRocywgbi5haGVhZCA9IDEwLCA0LCAxLCAxKSAKZmNkXzEwX0Fub2thJHByZWQKIyBDbGF5CiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c0NsYXlNTikKQ2xheV9jYXNlcyA8LSB0c0NsYXlNTlssICJDYXNlcyJdCkNsYXlfY2FzZXNfdHJhaW4gPC0gQ2xheV9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKQ2xheV9jYXNlc190ZXN0IDwtIENsYXlfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCkNsYXlfZGVhdGhzIDwtIHRzQ2xheU1OWywgIkRlYXRocyJdCkNsYXlfZGVhdGhzX3RyYWluIDwtIENsYXlfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpDbGF5X2RlYXRoc190ZXN0IDwtIENsYXlfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfQ2xheV9jYXNlcyA8LSBhdXRvLmFyaW1hKENsYXlfY2FzZXMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0NsYXlfY2FzZXMgIyBBUklNQSgzLCAxLCAwKSwgQUlDYyAtIDU3MC42CmF1dG9wbG90KGZpdF9DbGF5X2Nhc2VzKQpzYXJpbWEuZm9yKENsYXlfY2FzZXNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMywgMSwgMCkKbGluZXMoQ2xheV9jYXNlc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfQ2xheV9jYXNlcykgIyBwYXNzZXMKZml0X0NsYXlfZGVhdGhzIDwtIGF1dG8uYXJpbWEoQ2xheV9kZWF0aHMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0NsYXlfZGVhdGhzICMgQVJJTUEoMCwgMSwgNSksIEFJQ2MgLSAxMTcuMTgKYXV0b3Bsb3QoZml0X0NsYXlfZGVhdGhzKQpzYXJpbWEuZm9yKENsYXlfZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDAsIDEsIDUpCmxpbmVzKENsYXlfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9DbGF5X2RlYXRocykgIyBwYXNzZXMKIyBVc2UgYmVzdCBtb2RlbHMgdG8gZm9yZWNhc3QgZnVydGhlciBhaGVhZApmY18xMF9DbGF5IDwtIHNhcmltYS5mb3IoQ2xheV9jYXNlcywgbi5haGVhZCA9IDEwLCAzLCAxLCAwKQpmY18xMF9DbGF5JHByZWQKZmNkXzEwX0NsYXkgPC0gc2FyaW1hLmZvcihDbGF5X2RlYXRocywgbi5haGVhZCA9IDEwLCAwLCAxLCA1KSAKZmNkXzEwX0NsYXkkcHJlZAojIERha290YQojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMKYXV0b3Bsb3QodHNEYWtvdGFNTikKRGFrb3RhX2Nhc2VzIDwtIHRzRGFrb3RhTU5bLCAiQ2FzZXMiXQpEYWtvdGFfY2FzZXNfdHJhaW4gPC0gRGFrb3RhX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpEYWtvdGFfY2FzZXNfdGVzdCA8LSBEYWtvdGFfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCkRha290YV9kZWF0aHMgPC0gdHNEYWtvdGFNTlssICJEZWF0aHMiXQpEYWtvdGFfZGVhdGhzX3RyYWluIDwtIERha290YV9kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCkRha290YV9kZWF0aHNfdGVzdCA8LSBEYWtvdGFfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfRGFrb3RhX2Nhc2VzIDwtIGF1dG8uYXJpbWEoRGFrb3RhX2Nhc2VzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9EYWtvdGFfY2FzZXMgIyBBUklNQSg0LCAxLCAxKSwgQUlDYyAtIDYwMi4wNAphdXRvcGxvdChmaXRfRGFrb3RhX2Nhc2VzKQpzYXJpbWEuZm9yKERha290YV9jYXNlc190cmFpbiwgbi5haGVhZCA9IDIwLCA0LCAxLCAxKQpsaW5lcyhEYWtvdGFfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X0Rha290YV9jYXNlcykgIyBwYXNzZXMKZml0X0Rha290YV9kZWF0aHMgPC0gYXV0by5hcmltYShEYWtvdGFfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9EYWtvdGFfZGVhdGhzICMgQVJJTUEoMCwgMSwgNSksIEFJQ2MgLSAxMTcuMTgKYXV0b3Bsb3QoZml0X0Rha290YV9kZWF0aHMpCnNhcmltYS5mb3IoRGFrb3RhX2RlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCAwLCAxLCA1KQpsaW5lcyhEYWtvdGFfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9EYWtvdGFfZGVhdGhzKSAjIHBhc3NlcwojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX0Rha290YSA8LSBzYXJpbWEuZm9yKERha290YV9jYXNlcywgbi5haGVhZCA9IDEwLCA0LCAxLCAxKQpmY18xMF9EYWtvdGEkcHJlZApmY2RfMTBfRGFrb3RhIDwtIHNhcmltYS5mb3IoRGFrb3RhX2RlYXRocywgbi5haGVhZCA9IDEwLCAwLCAxLCA1KSAKZmNkXzEwX0Rha290YSRwcmVkCiMgSGVubmVwaW4KIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KHRzSGVubmVwaW5NTikKSGVubmVwaW5fY2FzZXMgPC0gdHNIZW5uZXBpbk1OWywgIkNhc2VzIl0KSGVubmVwaW5fY2FzZXNfdHJhaW4gPC0gSGVubmVwaW5fY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCkhlbm5lcGluX2Nhc2VzX3Rlc3QgPC0gSGVubmVwaW5fY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCkhlbm5lcGluX2RlYXRocyA8LSB0c0hlbm5lcGluTU5bLCAiRGVhdGhzIl0KSGVubmVwaW5fZGVhdGhzX3RyYWluIDwtIEhlbm5lcGluX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKSGVubmVwaW5fZGVhdGhzX3Rlc3QgPC0gSGVubmVwaW5fZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfSGVubmVwaW5fY2FzZXMgPC0gYXV0by5hcmltYShIZW5uZXBpbl9jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfSGVubmVwaW5fY2FzZXMgIyBBUklNQSgwLCAxLCA1KSwgQUlDYyAtIDk2NS41OQphdXRvcGxvdChmaXRfSGVubmVwaW5fY2FzZXMpCnNhcmltYS5mb3IoSGVubmVwaW5fY2FzZXNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMCwgMSwgNSkKbGluZXMoSGVubmVwaW5fY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X0hlbm5lcGluX2Nhc2VzKSAjIHBhc3NlcwpmaXRfSGVubmVwaW5fZGVhdGhzIDwtIGF1dG8uYXJpbWEoSGVubmVwaW5fZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9IZW5uZXBpbl9kZWF0aHMgIyBBUklNQSg0LCAxLCAxKSwgQUlDYyAtIDUyNy4yNAphdXRvcGxvdChmaXRfSGVubmVwaW5fZGVhdGhzKQpzYXJpbWEuZm9yKEhlbm5lcGluX2RlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCA0LCAxLCAxKQpsaW5lcyhIZW5uZXBpbl9kZWF0aHNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X0hlbm5lcGluX2RlYXRocykgIyBwYXNzZXMKIyBVc2UgYmVzdCBtb2RlbHMgdG8gZm9yZWNhc3QgZnVydGhlciBhaGVhZApmY18xMF9IZW5uZXBpbiA8LSBzYXJpbWEuZm9yKEhlbm5lcGluX2Nhc2VzLCBuLmFoZWFkID0gMTAsIDAsIDEsIDUpCmZjXzEwX0hlbm5lcGluJHByZWQKZmNkXzEwX0hlbm5lcGluIDwtIHNhcmltYS5mb3IoSGVubmVwaW5fZGVhdGhzLCBuLmFoZWFkID0gMTAsIDQsIDEsIDEpIApmY2RfMTBfSGVubmVwaW4kcHJlZAojIEthbmRpeW9oaQojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMKYXV0b3Bsb3QodHNLYW5kaXlvaGlNTikKS2FuZGl5b2hpX2Nhc2VzIDwtIHRzS2FuZGl5b2hpTU5bLCAiQ2FzZXMiXQpLYW5kaXlvaGlfY2FzZXNfdHJhaW4gPC0gS2FuZGl5b2hpX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpLYW5kaXlvaGlfY2FzZXNfdGVzdCA8LSBLYW5kaXlvaGlfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCkthbmRpeW9oaV9kZWF0aHMgPC0gdHNLYW5kaXlvaGlNTlssICJEZWF0aHMiXQpLYW5kaXlvaGlfZGVhdGhzX3RyYWluIDwtIEthbmRpeW9oaV9kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCkthbmRpeW9oaV9kZWF0aHNfdGVzdCA8LSBLYW5kaXlvaGlfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfS2FuZGl5b2hpX2Nhc2VzIDwtIGF1dG8uYXJpbWEoS2FuZGl5b2hpX2Nhc2VzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9LYW5kaXlvaGlfY2FzZXMgIyBBUklNQSg0LCAxLCAwKSwgQUlDYyAtIDYwOQphdXRvcGxvdChmaXRfS2FuZGl5b2hpX2Nhc2VzKQpzYXJpbWEuZm9yKEthbmRpeW9oaV9jYXNlc190cmFpbiwgbi5haGVhZCA9IDIwLCA0LCAxLCAwKQpsaW5lcyhLYW5kaXlvaGlfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X0thbmRpeW9oaV9jYXNlcykgIyBwYXNzZXMKZml0X0thbmRpeW9oaV9kZWF0aHMgPC0gYXV0by5hcmltYShLYW5kaXlvaGlfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9LYW5kaXlvaGlfZGVhdGhzICMgQVJJTUEoMCwgMCwgMCksIEFJQ2MgLSAxOTcuMTQgV2hpdGUgTm9pc2UgTW9kZWwKYXV0b3Bsb3QoZml0X0thbmRpeW9oaV9kZWF0aHMpCnNhcmltYS5mb3IoS2FuZGl5b2hpX2RlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCAwLCAwLCAwKQpsaW5lcyhLYW5kaXlvaGlfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9LYW5kaXlvaGlfZGVhdGhzKSAjIHBhc3NlcwojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX0thbmRpeW9oaSA8LSBzYXJpbWEuZm9yKEthbmRpeW9oaV9jYXNlcywgbi5haGVhZCA9IDEwLCA0LCAxLCAwKQpmY18xMF9LYW5kaXlvaGkkcHJlZApmY2RfMTBfS2FuZGl5b2hpIDwtIHNhcmltYS5mb3IoS2FuZGl5b2hpX2RlYXRocywgbi5haGVhZCA9IDEwLCAwLCAwLCAwKSAKZmNkXzEwX0thbmRpeW9oaSRwcmVkCiMgTm9ibGVzCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c05vYmxlc01OKQpOb2JsZXNfY2FzZXMgPC0gdHNOb2JsZXNNTlssICJDYXNlcyJdCk5vYmxlc19jYXNlc190cmFpbiA8LSBOb2JsZXNfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCk5vYmxlc19jYXNlc190ZXN0IDwtIE5vYmxlc19jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKTm9ibGVzX2RlYXRocyA8LSB0c05vYmxlc01OWywgIkRlYXRocyJdCk5vYmxlc19kZWF0aHNfdHJhaW4gPC0gTm9ibGVzX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKTm9ibGVzX2RlYXRoc190ZXN0IDwtIE5vYmxlc19kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9Ob2JsZXNfY2FzZXMgPC0gYXV0by5hcmltYShOb2JsZXNfY2FzZXMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X05vYmxlc19jYXNlcyAjIEFSSU1BKDEsIDEsIDMpLCBBSUNjIC0gODY0LjA0CmF1dG9wbG90KGZpdF9Ob2JsZXNfY2FzZXMpCnNhcmltYS5mb3IoTm9ibGVzX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDEsIDEsIDMpOyBsaW5lcyhOb2JsZXNfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X05vYmxlc19jYXNlcykgIyBwYXNzZXMKZml0X05vYmxlc19kZWF0aHMgPC0gYXV0by5hcmltYShOb2JsZXNfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9Ob2JsZXNfZGVhdGhzICMgQVJJTUEoMCwgMCwgMCksIEFJQ2MgLSAxMjIuMjggV2hpdGUgTm9pc2UgTW9kZWwKYXV0b3Bsb3QoZml0X05vYmxlc19kZWF0aHMpCnNhcmltYS5mb3IoTm9ibGVzX2RlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCAwLCAwLCAwKQpsaW5lcyhOb2JsZXNfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9Ob2JsZXNfZGVhdGhzKSAjIHBhc3NlcwojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX05vYmxlcyA8LSBzYXJpbWEuZm9yKE5vYmxlc19jYXNlcywgbi5haGVhZCA9IDEwLCAxLCAxLCAzKQpmY18xMF9Ob2JsZXMkcHJlZApmY2RfMTBfTm9ibGVzIDwtIHNhcmltYS5mb3IoTm9ibGVzX2RlYXRocywgbi5haGVhZCA9IDEwLCAwLCAwLCAwKSAKZmNkXzEwX05vYmxlcyRwcmVkCiMgUmFtc2V5CiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c1JhbXNleU1OKQpSYW1zZXlfY2FzZXMgPC0gdHNSYW1zZXlNTlssICJDYXNlcyJdClJhbXNleV9jYXNlc190cmFpbiA8LSBSYW1zZXlfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpClJhbXNleV9jYXNlc190ZXN0IDwtIFJhbXNleV9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKUmFtc2V5X2RlYXRocyA8LSB0c1JhbXNleU1OWywgIkRlYXRocyJdClJhbXNleV9kZWF0aHNfdHJhaW4gPC0gUmFtc2V5X2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKUmFtc2V5X2RlYXRoc190ZXN0IDwtIFJhbXNleV9kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9SYW1zZXlfY2FzZXMgPC0gYXV0by5hcmltYShSYW1zZXlfY2FzZXMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X1JhbXNleV9jYXNlcyAjIEFSSU1BKDUsIDEsIDApLCBBSUNjIC0gNjQ3LjcxCmF1dG9wbG90KGZpdF9SYW1zZXlfY2FzZXMpCnNhcmltYS5mb3IoUmFtc2V5X2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDUsIDEsIDApCmxpbmVzKFJhbXNleV9jYXNlc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfUmFtc2V5X2Nhc2VzKSAjIGRvZXMgbm90IHBhc3MKZml0X1JhbXNleV9jYXNlczIgPC0gYXJpbWEoUmFtc2V5X2Nhc2VzLCBvcmRlciA9IGMoNiwgMywgNSkpCmNoZWNrcmVzaWR1YWxzKGZpdF9SYW1zZXlfY2FzZXMyKSAjIHBhc3NlcwpmaXRfUmFtc2V5X2RlYXRocyA8LSBhdXRvLmFyaW1hKFJhbXNleV9kZWF0aHMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X1JhbXNleV9kZWF0aHMgIyBBUklNQSgwLCAxLCAxKSwgQUlDYyAtIDIyNC4wMSBXaGl0ZSBOb2lzZSBNb2RlbAphdXRvcGxvdChmaXRfUmFtc2V5X2RlYXRocykKc2FyaW1hLmZvcihSYW1zZXlfZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDAsIDEsIDEpCmxpbmVzKFJhbXNleV9kZWF0aHNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X1JhbXNleV9kZWF0aHMpICMgZG9lcyBub3QgcGFzcwpmaXRfUmFtc2V5X2RlYXRoczIgPC0gYXJpbWEoUmFtc2V5X2RlYXRocywgb3JkZXIgPSBjKDEsIDEsIDIpKQpjaGVja3Jlc2lkdWFscyhmaXRfUmFtc2V5X2RlYXRoczIpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfUmFtc2V5IDwtIHNhcmltYS5mb3IoUmFtc2V5X2Nhc2VzLCBuLmFoZWFkID0gMTAsIDYsIDMsIDUpCmZjXzEwX1JhbXNleSRwcmVkCmZjZF8xMF9SYW1zZXkgPC0gc2FyaW1hLmZvcihSYW1zZXlfZGVhdGhzLCBuLmFoZWFkID0gMTAsIDEsIDEsIDIpIApmY2RfMTBfUmFtc2V5JHByZWQKIyBTdGVhcm5zCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c1N0ZWFybnNNTikKU3RlYXJuc19jYXNlcyA8LSB0c1N0ZWFybnNNTlssICJDYXNlcyJdClN0ZWFybnNfY2FzZXNfdHJhaW4gPC0gU3RlYXJuc19jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKU3RlYXJuc19jYXNlc190ZXN0IDwtIFN0ZWFybnNfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpClN0ZWFybnNfZGVhdGhzIDwtIHRzU3RlYXJuc01OWywgIkRlYXRocyJdClN0ZWFybnNfZGVhdGhzX3RyYWluIDwtIFN0ZWFybnNfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpTdGVhcm5zX2RlYXRoc190ZXN0IDwtIFN0ZWFybnNfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfU3RlYXJuc19jYXNlcyA8LSBhdXRvLmFyaW1hKFN0ZWFybnNfY2FzZXMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X1N0ZWFybnNfY2FzZXMgIyBBUklNQSgwLCAxLCA0KSwgQUlDYyAtIDg4Ny4xMQphdXRvcGxvdChmaXRfU3RlYXJuc19jYXNlcykKc2FyaW1hLmZvcihTdGVhcm5zX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDAsIDEsIDQpCmxpbmVzKFN0ZWFybnNfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X1N0ZWFybnNfY2FzZXMpICMgcGFzc2VzCmZpdF9TdGVhcm5zX2RlYXRocyA8LSBhdXRvLmFyaW1hKFN0ZWFybnNfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9TdGVhcm5zX2RlYXRocyAjIEFSSU1BKDIsIDEsIDApLCBBSUNjIC0gMzUuMDQKYXV0b3Bsb3QoZml0X1N0ZWFybnNfZGVhdGhzKQpzYXJpbWEuZm9yKFN0ZWFybnNfZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDIsIDEsIDApCmxpbmVzKFN0ZWFybnNfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9TdGVhcm5zX2RlYXRocykgIyBwYXNzZXMKIyBVc2UgYmVzdCBtb2RlbHMgdG8gZm9yZWNhc3QgZnVydGhlciBhaGVhZApmY18xMF9TdGVhcm5zIDwtIHNhcmltYS5mb3IoU3RlYXJuc19jYXNlcywgbi5haGVhZCA9IDEwLCAwLCAxLCA0KQpmY18xMF9TdGVhcm5zJHByZWQKZmNkXzEwX1N0ZWFybnMgPC0gc2FyaW1hLmZvcihTdGVhcm5zX2RlYXRocywgbi5haGVhZCA9IDEwLCAyLCAxLCAwKSAKZmNkXzEwX1N0ZWFybnMkcHJlZAojIFdhc2hpbmd0b24KIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KHRzV2FzaGluZ3Rvbk1OKQpXYXNoaW5ndG9uX2Nhc2VzIDwtIHRzV2FzaGluZ3Rvbk1OWywgIkNhc2VzIl0KV2FzaGluZ3Rvbl9jYXNlc190cmFpbiA8LSBXYXNoaW5ndG9uX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpXYXNoaW5ndG9uX2Nhc2VzX3Rlc3QgPC0gV2FzaGluZ3Rvbl9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKV2FzaGluZ3Rvbl9kZWF0aHMgPC0gdHNXYXNoaW5ndG9uTU5bLCAiRGVhdGhzIl0KV2FzaGluZ3Rvbl9kZWF0aHNfdHJhaW4gPC0gV2FzaGluZ3Rvbl9kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCldhc2hpbmd0b25fZGVhdGhzX3Rlc3QgPC0gV2FzaGluZ3Rvbl9kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9XYXNoaW5ndG9uX2Nhc2VzIDwtIGF1dG8uYXJpbWEoV2FzaGluZ3Rvbl9jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfV2FzaGluZ3Rvbl9jYXNlcyAjIEFSSU1BKDEsIDEsIDIpLCBBSUNjIC0gNDY1Ljk0CmF1dG9wbG90KGZpdF9XYXNoaW5ndG9uX2Nhc2VzKQpzYXJpbWEuZm9yKFdhc2hpbmd0b25fY2FzZXNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMCwgMSwgNCkKbGluZXMoV2FzaGluZ3Rvbl9jYXNlc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfV2FzaGluZ3Rvbl9jYXNlcykgIyBwYXNzZXMKZml0X1dhc2hpbmd0b25fZGVhdGhzIDwtIGF1dG8uYXJpbWEoV2FzaGluZ3Rvbl9kZWF0aHMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X1dhc2hpbmd0b25fZGVhdGhzICMgQVJJTUEoMiwgMSwgMyksIEFJQ2MgLSA4NC4yNQphdXRvcGxvdChmaXRfV2FzaGluZ3Rvbl9kZWF0aHMpCnNhcmltYS5mb3IoV2FzaGluZ3Rvbl9kZWF0aHNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMiwgMSwgMykKbGluZXMoV2FzaGluZ3Rvbl9kZWF0aHNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X1dhc2hpbmd0b25fZGVhdGhzKSAjIGRvZXMgbm90IHBhc3MKZml0X1dhc2hpbmd0b25fZGVhdGhzMiA8LSBhcmltYShXYXNoaW5ndG9uX2RlYXRocywgb3JkZXIgPSBjKDMsIDEsIDgpKQpjaGVja3Jlc2lkdWFscyhmaXRfV2FzaGluZ3Rvbl9kZWF0aHMyKSAjIHAtdmFsdWUgb2YgMC4wMjg0NywgY2xvc2VzdCBJIGNvdWxkIGdldCB0byAwLjA1CiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfV2FzaGluZ3RvbiA8LSBzYXJpbWEuZm9yKFdhc2hpbmd0b25fY2FzZXMsIG4uYWhlYWQgPSAxMCwgMCwgMSwgNCkKZmNfMTBfV2FzaGluZ3RvbiRwcmVkCmZjZF8xMF9XYXNoaW5ndG9uIDwtIHNhcmltYS5mb3IoV2FzaGluZ3Rvbl9kZWF0aHMsIG4uYWhlYWQgPSAxMCwgMywgMSwgOCkgCmZjZF8xMF9XYXNoaW5ndG9uJHByZWQKCiMgUmVwZWF0IGZvciBORSBDb3VudGllcwojIERha290YQojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMKYXV0b3Bsb3QodHNEYWtvdGFORSkKRGFrb3RhX2Nhc2VzIDwtIHRzRGFrb3RhTkVbLCAiQ2FzZXMiXQpEYWtvdGFfY2FzZXNfdHJhaW4gPC0gRGFrb3RhX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpEYWtvdGFfY2FzZXNfdGVzdCA8LSBEYWtvdGFfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCkRha290YV9kZWF0aHMgPC0gdHNEYWtvdGFORVssICJEZWF0aHMiXQpEYWtvdGFfZGVhdGhzX3RyYWluIDwtIERha290YV9kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCkRha290YV9kZWF0aHNfdGVzdCA8LSBEYWtvdGFfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfRGFrb3RhX2Nhc2VzIDwtIGF1dG8uYXJpbWEoRGFrb3RhX2Nhc2VzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9EYWtvdGFfY2FzZXMgIyBBUklNQSgwLCAxLCA1KSwgQUlDYyAtIDExMDIuNTUKYXV0b3Bsb3QoZml0X0Rha290YV9jYXNlcykKc2FyaW1hLmZvcihEYWtvdGFfY2FzZXNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMCwgMSwgNSk7IGxpbmVzKERha290YV9jYXNlc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfRGFrb3RhX2Nhc2VzKSAjIHBhc3NlcyBManVuZyBCb3ggdGVzdApmaXRfRGFrb3RhX2RlYXRocyA8LSBhdXRvLmFyaW1hKERha290YV9kZWF0aHMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0Rha290YV9kZWF0aHMgIyBBUklNQSgzLCAxLCAyKSwgQUlDYyAtIDQ1Ljc1CmF1dG9wbG90KGZpdF9EYWtvdGFfZGVhdGhzKQpzYXJpbWEuZm9yKERha290YV9kZWF0aHNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMywgMSwgMikKbGluZXMoRGFrb3RhX2RlYXRoc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfRGFrb3RhX2RlYXRocykgIyBwYXNzZXMKIyBVc2UgYmVzdCBtb2RlbHMgdG8gZm9yZWNhc3QgZnVydGhlciBhaGVhZApmY18xMF9EYWtvdGEgPC0gc2FyaW1hLmZvcihEYWtvdGFfY2FzZXMsIG4uYWhlYWQgPSAxMCwgMCwgMSwgNSkKZmNfMTBfRGFrb3RhJHByZWQKZmNkXzEwX0Rha290YSA8LSBzYXJpbWEuZm9yKERha290YV9kZWF0aHMsIG4uYWhlYWQgPSAxMCwgMywgMSwgMikgCmZjZF8xMF9EYWtvdGEkcHJlZAojIERvdWdsYXMKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KHRzRG91Z2xhc05FKQpEb3VnbGFzX2Nhc2VzIDwtIHRzRG91Z2xhc05FWywgIkNhc2VzIl0KRG91Z2xhc19jYXNlc190cmFpbiA8LSBEb3VnbGFzX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpEb3VnbGFzX2Nhc2VzX3Rlc3QgPC0gRG91Z2xhc19jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKRG91Z2xhc19kZWF0aHMgPC0gdHNEb3VnbGFzTkVbLCAiRGVhdGhzIl0KRG91Z2xhc19kZWF0aHNfdHJhaW4gPC0gRG91Z2xhc19kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCkRvdWdsYXNfZGVhdGhzX3Rlc3QgPC0gRG91Z2xhc19kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9Eb3VnbGFzX2Nhc2VzIDwtIGF1dG8uYXJpbWEoRG91Z2xhc19jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfRG91Z2xhc19jYXNlcyAjIEFSSU1BKDEsIDIsIDQpLCBBSUNjIC0gODMyLjk3CmF1dG9wbG90KGZpdF9Eb3VnbGFzX2Nhc2VzKQpzYXJpbWEuZm9yKERvdWdsYXNfY2FzZXNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMSwgMiwgNCkKbGluZXMoRG91Z2xhc19jYXNlc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfRG91Z2xhc19jYXNlcykgIyBwYXNzZXMKZml0X0RvdWdsYXNfZGVhdGhzIDwtIGF1dG8uYXJpbWEoRG91Z2xhc19kZWF0aHMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0RvdWdsYXNfZGVhdGhzICMgQVJJTUEoMCwgMSwgMSksIEFJQ2MgLSAxODcuMzgKYXV0b3Bsb3QoZml0X0RvdWdsYXNfZGVhdGhzKQpzYXJpbWEuZm9yKERvdWdsYXNfZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDAsIDEsIDEpCmxpbmVzKERvdWdsYXNfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9Eb3VnbGFzX2RlYXRocykgIyBkb2VzIG5vdCBwYXNzCmZpdF9Eb3VnbGFzX2RlYXRoczIgPC0gYXJpbWEoRG91Z2xhc19kZWF0aHMsIG9yZGVyID0gYygxMCwgMiwgMTApKQpjaGVja3Jlc2lkdWFscyhmaXRfRG91Z2xhc19kZWF0aHMyKSAjIHAtdmFsdWUgPSAwLjQ4MjcsIGNsb3Nlc3QgSSBjb3VsZCBnZXQgdG8gMC4wNQojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX0RvdWdsYXMgPC0gc2FyaW1hLmZvcihEb3VnbGFzX2Nhc2VzLCBuLmFoZWFkID0gMTAsIDEsIDIsIDUpCmZjXzEwX0RvdWdsYXMkcHJlZApmY2RfMTBfRG91Z2xhcyA8LSBzYXJpbWEuZm9yKERvdWdsYXNfZGVhdGhzLCBuLmFoZWFkID0gMTAsIDEwLCAyLCAxMCkgCmZjZF8xMF9Eb3VnbGFzJHByZWQKIyBIYWxsCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c0hhbGxORSkKSGFsbF9jYXNlcyA8LSB0c0hhbGxORVssICJDYXNlcyJdCkhhbGxfY2FzZXNfdHJhaW4gPC0gSGFsbF9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKSGFsbF9jYXNlc190ZXN0IDwtIEhhbGxfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCkhhbGxfZGVhdGhzIDwtIHRzSGFsbE5FWywgIkRlYXRocyJdCkhhbGxfZGVhdGhzX3RyYWluIDwtIEhhbGxfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpIYWxsX2RlYXRoc190ZXN0IDwtIEhhbGxfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfSGFsbF9jYXNlcyA8LSBhdXRvLmFyaW1hKEhhbGxfY2FzZXMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0hhbGxfY2FzZXMgIyBBUklNQSg1LCAxLCAwKSwgQUlDYyAtIDkzMy43NgphdXRvcGxvdChmaXRfSGFsbF9jYXNlcykKc2FyaW1hLmZvcihIYWxsX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDUsIDEsIDApCmxpbmVzKEhhbGxfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X0hhbGxfY2FzZXMpICMgcGFzc2VzCmZpdF9IYWxsX2RlYXRocyA8LSBhdXRvLmFyaW1hKEhhbGxfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9IYWxsX2RlYXRocyAjIEFSSU1BKDAsIDEsIDEpLCBBSUNjIC0gNDI3LjkxCmF1dG9wbG90KGZpdF9IYWxsX2RlYXRocykKc2FyaW1hLmZvcihIYWxsX2RlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCAwLCAxLCAxKQpsaW5lcyhIYWxsX2RlYXRoc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfSGFsbF9kZWF0aHMpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfSGFsbCA8LSBzYXJpbWEuZm9yKEhhbGxfY2FzZXMsIG4uYWhlYWQgPSAxMCwgNSwgMSwgMCkKZmNfMTBfSGFsbCRwcmVkCmZjZF8xMF9IYWxsIDwtIHNhcmltYS5mb3IoSGFsbF9kZWF0aHMsIG4uYWhlYWQgPSAxMCwgMCwgMSwgMSkgCmZjZF8xMF9IYWxsJHByZWQKIyBTY290dHMgQmx1ZmYKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KHRzU2NvdHRzTkUpClNjb3R0c19jYXNlcyA8LSB0c1Njb3R0c05FWywgIkNhc2VzIl0KU2NvdHRzX2Nhc2VzX3RyYWluIDwtIFNjb3R0c19jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKU2NvdHRzX2Nhc2VzX3Rlc3QgPC0gU2NvdHRzX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpTY290dHNfZGVhdGhzIDwtIHRzU2NvdHRzTkVbLCAiRGVhdGhzIl0KU2NvdHRzX2RlYXRoc190cmFpbiA8LSBTY290dHNfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpTY290dHNfZGVhdGhzX3Rlc3QgPC0gU2NvdHRzX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X1Njb3R0c19jYXNlcyA8LSBhdXRvLmFyaW1hKFNjb3R0c19jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfU2NvdHRzX2Nhc2VzICMgQVJJTUEoMSwgMSwgMiksIEFJQ2MgLSAyNjguNwphdXRvcGxvdChmaXRfU2NvdHRzX2Nhc2VzKQpzYXJpbWEuZm9yKFNjb3R0c19jYXNlc190cmFpbiwgbi5haGVhZCA9IDIwLCAxLCAxLCAyKQpsaW5lcyhTY290dHNfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X1Njb3R0c19jYXNlcykgIyBwYXNzZXMKZml0X1Njb3R0c19kZWF0aHMgPC0gYXV0by5hcmltYShTY290dHNfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9TY290dHNfZGVhdGhzICMgQVJJTUEoMCwgMCwgMCksIEFJQ2MgLSBJbmYgKG5vIGRlYXRocyByZWNvcmRlZCkKYXV0b3Bsb3QoZml0X1Njb3R0c19kZWF0aHMpCnNhcmltYS5mb3IoU2NvdHRzX2RlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCAwLCAwLCAwKQpsaW5lcyhTY290dHNfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9TY290dHNfZGVhdGhzKSAjIHBhc3NlcwojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX1Njb3R0cyA8LSBzYXJpbWEuZm9yKFNjb3R0c19jYXNlcywgbi5haGVhZCA9IDEwLCAxLCAxLCAyKQpmY18xMF9TY290dHMkcHJlZAoKIyBSZXBlYXQgZm9yIFBBIENvdW50aWVzCiMgQnVja3MKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KHRzQnVja3NQQSkKQnVja3NfY2FzZXMgPC0gdHNCdWNrc1BBWywgIkNhc2VzIl0KQnVja3NfY2FzZXNfdHJhaW4gPC0gQnVja3NfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCkJ1Y2tzX2Nhc2VzX3Rlc3QgPC0gQnVja3NfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCkJ1Y2tzX2RlYXRocyA8LSB0c0J1Y2tzUEFbLCAiRGVhdGhzIl0KQnVja3NfZGVhdGhzX3RyYWluIDwtIEJ1Y2tzX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKQnVja3NfZGVhdGhzX3Rlc3QgPC0gQnVja3NfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfQnVja3NfY2FzZXMgPC0gYXV0by5hcmltYShCdWNrc19jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfQnVja3NfY2FzZXMgIyBBUklNQSgyLCAxLCAyKSwgQUlDYyAtIDEwMjEuNzYKYXV0b3Bsb3QoZml0X0J1Y2tzX2Nhc2VzKQpzYXJpbWEuZm9yKEJ1Y2tzX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDIsIDEsIDIpCmxpbmVzKEJ1Y2tzX2Nhc2VzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9CdWNrc19jYXNlcykgIyBwYXNzZXMgTGp1bmcgQm94IHRlc3QKZml0X0J1Y2tzX2RlYXRocyA8LSBhdXRvLmFyaW1hKEJ1Y2tzX2RlYXRocywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfQnVja3NfZGVhdGhzICMgQVJJTUEoNCwgMSwgMSksIEFJQ2MgLSA2MzUuNzcKYXV0b3Bsb3QoZml0X0J1Y2tzX2RlYXRocykKc2FyaW1hLmZvcihCdWNrc19kZWF0aHNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgNCwgMSwgMSkKbGluZXMoQnVja3NfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9CdWNrc19kZWF0aHMpICMgZG9lcyBub3QgcGFzcwpmaXRfQnVja3NfZGVhdGhzMiA8LSBhcmltYShCdWNrc19kZWF0aHMsIG9yZGVyID0gYygxLCAyLCA5KSkKY2hlY2tyZXNpZHVhbHMoZml0X0J1Y2tzX2RlYXRoczIpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfQnVja3MgPC0gc2FyaW1hLmZvcihCdWNrc19jYXNlcywgbi5haGVhZCA9IDEwLCAyLCAxLCAyKQpmY18xMF9CdWNrcyRwcmVkCmZjZF8xMF9CdWNrcyA8LSBzYXJpbWEuZm9yKEJ1Y2tzX2RlYXRocywgbi5haGVhZCA9IDEwLCAxLCAyLCA5KSAKZmNkXzEwX0J1Y2tzJHByZWQKIyBNb250Z29tZXJ5CiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c01vbnRnb21lcnlQQSkKTW9udGdvbWVyeV9jYXNlcyA8LSB0c01vbnRnb21lcnlQQVssICJDYXNlcyJdCk1vbnRnb21lcnlfY2FzZXNfdHJhaW4gPC0gTW9udGdvbWVyeV9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKTW9udGdvbWVyeV9jYXNlc190ZXN0IDwtIE1vbnRnb21lcnlfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCk1vbnRnb21lcnlfZGVhdGhzIDwtIHRzTW9udGdvbWVyeVBBWywgIkRlYXRocyJdCk1vbnRnb21lcnlfZGVhdGhzX3RyYWluIDwtIE1vbnRnb21lcnlfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpNb250Z29tZXJ5X2RlYXRoc190ZXN0IDwtIE1vbnRnb21lcnlfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfTW9udGdvbWVyeV9jYXNlcyA8LSBhdXRvLmFyaW1hKE1vbnRnb21lcnlfY2FzZXMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X01vbnRnb21lcnlfY2FzZXMgIyBBUklNQSgxLCAxLCAwKSwgQUlDYyAtIDk4Ny41MwphdXRvcGxvdChmaXRfTW9udGdvbWVyeV9jYXNlcykKc2FyaW1hLmZvcihNb250Z29tZXJ5X2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDEsIDEsIDApCmxpbmVzKE1vbnRnb21lcnlfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X01vbnRnb21lcnlfY2FzZXMpICMgcGFzc2VzCmZpdF9Nb250Z29tZXJ5X2RlYXRocyA8LSBhdXRvLmFyaW1hKE1vbnRnb21lcnlfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9Nb250Z29tZXJ5X2RlYXRocyAjIEFSSU1BKDUsIDEsIDApLCBBSUNjIC0gODAwLjI5CmF1dG9wbG90KGZpdF9Nb250Z29tZXJ5X2RlYXRocykKc2FyaW1hLmZvcihNb250Z29tZXJ5X2RlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCA1LCAxLCAwKQpsaW5lcyhNb250Z29tZXJ5X2RlYXRoc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfTW9udGdvbWVyeV9kZWF0aHMpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfTW9udGdvbWVyeSA8LSBzYXJpbWEuZm9yKE1vbnRnb21lcnlfY2FzZXMsIG4uYWhlYWQgPSAxMCwgMSwgMSwgMCkKZmNfMTBfTW9udGdvbWVyeSRwcmVkCmZjZF8xMF9Nb250Z29tZXJ5IDwtIHNhcmltYS5mb3IoTW9udGdvbWVyeV9kZWF0aHMsIG4uYWhlYWQgPSAxMCwgNSwgMSwgMCkgCmZjZF8xMF9Nb250Z29tZXJ5JHByZWQKIyBQaGlsYWRlbHBoaWEKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KHRzUGhpbGFkZWxwaGlhUEEpClBoaWxhZGVscGhpYV9jYXNlcyA8LSB0c1BoaWxhZGVscGhpYVBBWywgIkNhc2VzIl0KUGhpbGFkZWxwaGlhX2Nhc2VzX3RyYWluIDwtIFBoaWxhZGVscGhpYV9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKUGhpbGFkZWxwaGlhX2Nhc2VzX3Rlc3QgPC0gUGhpbGFkZWxwaGlhX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpQaGlsYWRlbHBoaWFfZGVhdGhzIDwtIHRzUGhpbGFkZWxwaGlhUEFbLCAiRGVhdGhzIl0KUGhpbGFkZWxwaGlhX2RlYXRoc190cmFpbiA8LSBQaGlsYWRlbHBoaWFfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpQaGlsYWRlbHBoaWFfZGVhdGhzX3Rlc3QgPC0gUGhpbGFkZWxwaGlhX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X1BoaWxhZGVscGhpYV9jYXNlcyA8LSBhdXRvLmFyaW1hKFBoaWxhZGVscGhpYV9jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfUGhpbGFkZWxwaGlhX2Nhc2VzICMgQVJJTUEoMCwgMSwgMyksIEFJQ2MgLSAxMzc3Ljk0CmF1dG9wbG90KGZpdF9QaGlsYWRlbHBoaWFfY2FzZXMpCnNhcmltYS5mb3IoUGhpbGFkZWxwaGlhX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDAsIDEsIDMpCmxpbmVzKFBoaWxhZGVscGhpYV9jYXNlc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfUGhpbGFkZWxwaGlhX2Nhc2VzKSAjIHBhc3NlcwpmaXRfUGhpbGFkZWxwaGlhX2RlYXRocyA8LSBhdXRvLmFyaW1hKFBoaWxhZGVscGhpYV9kZWF0aHMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X1BoaWxhZGVscGhpYV9kZWF0aHMgIyBBUklNQSgwLCAxLCAyKSwgQUlDYyAtIDg0OS43NgphdXRvcGxvdChmaXRfUGhpbGFkZWxwaGlhX2RlYXRocykKc2FyaW1hLmZvcihQaGlsYWRlbHBoaWFfZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDAsIDEsIDIpCmxpbmVzKFBoaWxhZGVscGhpYV9kZWF0aHNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X1BoaWxhZGVscGhpYV9kZWF0aHMpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfUGhpbGFkZWxwaGlhIDwtIHNhcmltYS5mb3IoUGhpbGFkZWxwaGlhX2Nhc2VzLCBuLmFoZWFkID0gMTAsIDAsIDEsIDMpCmZjXzEwX1BoaWxhZGVscGhpYSRwcmVkCmZjZF8xMF9QaGlsYWRlbHBoaWEgPC0gc2FyaW1hLmZvcihQaGlsYWRlbHBoaWFfZGVhdGhzLCBuLmFoZWFkID0gMTAsIDAsIDEsIDIpIApmY2RfMTBfUGhpbGFkZWxwaGlhJHByZWQKCiMgUmVwZWF0IGZvciBTRCBDb3VudGllcwojIEJyb3duCiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c0Jyb3duU0QpCkJyb3duX2Nhc2VzIDwtIHRzQnJvd25TRFssICJDYXNlcyJdCkJyb3duX2Nhc2VzX3RyYWluIDwtIEJyb3duX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpCcm93bl9jYXNlc190ZXN0IDwtIEJyb3duX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfQnJvd25fY2FzZXMgPC0gYXV0by5hcmltYShCcm93bl9jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfQnJvd25fY2FzZXMgIyBBUklNQSg1LCAxLCAwKSwgQUlDYyAtIDQyNy4xMgphdXRvcGxvdChmaXRfQnJvd25fY2FzZXMpCnNhcmltYS5mb3IoQnJvd25fY2FzZXNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgNSwgMSwgMCkKbGluZXMoQnJvd25fY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X0Jyb3duX2Nhc2VzKSAjIHBhc3NlcyBManVuZyBCb3ggdGVzdAojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX0Jyb3duIDwtIHNhcmltYS5mb3IoQnJvd25fY2FzZXMsIG4uYWhlYWQgPSAxMCwgMiwgMSwgMikKZmNfMTBfQnJvd24kcHJlZAojIE1pbm5laGFoYQojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMKYXV0b3Bsb3QodHNNaW5uZWhhaGFTRCkKTWlubmVoYWhhX2Nhc2VzIDwtIHRzTWlubmVoYWhhU0RbLCAiQ2FzZXMiXQpNaW5uZWhhaGFfY2FzZXNfdHJhaW4gPC0gTWlubmVoYWhhX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpNaW5uZWhhaGFfY2FzZXNfdGVzdCA8LSBNaW5uZWhhaGFfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCk1pbm5laGFoYV9kZWF0aHMgPC0gdHNNaW5uZWhhaGFTRFssICJEZWF0aHMiXQpNaW5uZWhhaGFfZGVhdGhzX3RyYWluIDwtIE1pbm5laGFoYV9kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCk1pbm5laGFoYV9kZWF0aHNfdGVzdCA8LSBNaW5uZWhhaGFfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfTWlubmVoYWhhX2Nhc2VzIDwtIGF1dG8uYXJpbWEoTWlubmVoYWhhX2Nhc2VzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9NaW5uZWhhaGFfY2FzZXMgIyBBUklNQSgzLCAxLCAwKSwgQUlDYyAtIDkyMS4yMgphdXRvcGxvdChmaXRfTWlubmVoYWhhX2Nhc2VzKQpzYXJpbWEuZm9yKE1pbm5laGFoYV9jYXNlc190cmFpbiwgbi5haGVhZCA9IDIwLCAzLCAxLCAwKQpsaW5lcyhNaW5uZWhhaGFfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X01pbm5laGFoYV9jYXNlcykgIyBkb2VzIG5vdCBwYXNzCmZpdF9NaW5uZWhhaGFfY2FzZXMyIDwtIGFyaW1hKE1pbm5laGFoYV9jYXNlcywgb3JkZXIgPSBjKDYsIDEsIDIpKQpjaGVja3Jlc2lkdWFscyhmaXRfTWlubmVoYWhhX2Nhc2VzMikgIyBwYXNzZXMKZml0X01pbm5laGFoYV9kZWF0aHMgPC0gYXV0by5hcmltYShNaW5uZWhhaGFfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9NaW5uZWhhaGFfZGVhdGhzICMgQVJJTUEoMSwgMSwgNCksIEFJQ2MgLSAzMDAuNzkKYXV0b3Bsb3QoZml0X01pbm5laGFoYV9kZWF0aHMpCnNhcmltYS5mb3IoTWlubmVoYWhhX2RlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCAxLCAxLCA0KQpsaW5lcyhNaW5uZWhhaGFfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9NaW5uZWhhaGFfZGVhdGhzKSAjIHBhc3NlcwojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX01pbm5laGFoYSA8LSBzYXJpbWEuZm9yKE1pbm5laGFoYV9jYXNlcywgbi5haGVhZCA9IDEwLCA2LCAxLCAyKQpmY18xMF9NaW5uZWhhaGEkcHJlZApmY2RfMTBfTWlubmVoYWhhIDwtIHNhcmltYS5mb3IoTWlubmVoYWhhX2RlYXRocywgbi5haGVhZCA9IDEwLCAxLCAxLCA0KSAKZmNkXzEwX01pbm5laGFoYSRwcmVkCgojIFJlcGVhdCBmb3IgVFggQ291bnRpZXMKIyBEYWxsYXMKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KHRzRGFsbGFzVFgpCkRhbGxhc19jYXNlcyA8LSB0c0RhbGxhc1RYWywgIkNhc2VzIl0KRGFsbGFzX2Nhc2VzX3RyYWluIDwtIERhbGxhc19jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKRGFsbGFzX2Nhc2VzX3Rlc3QgPC0gRGFsbGFzX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpEYWxsYXNfZGVhdGhzIDwtIHRzRGFsbGFzVFhbLCAiRGVhdGhzIl0KRGFsbGFzX2RlYXRoc190cmFpbiA8LSBEYWxsYXNfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpEYWxsYXNfZGVhdGhzX3Rlc3QgPC0gRGFsbGFzX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X0RhbGxhc19jYXNlcyA8LSBhdXRvLmFyaW1hKERhbGxhc19jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfRGFsbGFzX2Nhc2VzICMgQVJJTUEoMiwgMSwgMCksIEFJQ2MgLSAxMDczLjYKYXV0b3Bsb3QoZml0X0RhbGxhc19jYXNlcykKc2FyaW1hLmZvcihEYWxsYXNfY2FzZXNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMiwgMSwgMCkKbGluZXMoRGFsbGFzX2Nhc2VzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9EYWxsYXNfY2FzZXMpICMgcGFzc2VzIExqdW5nIEJveCB0ZXN0CmZpdF9EYWxsYXNfZGVhdGhzIDwtIGF1dG8uYXJpbWEoRGFsbGFzX2RlYXRocywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfRGFsbGFzX2RlYXRocyAjIEFSSU1BKDIsIDEsIDMpLCBBSUNjIC0gNDUzCmF1dG9wbG90KGZpdF9EYWxsYXNfZGVhdGhzKQpzYXJpbWEuZm9yKERhbGxhc19kZWF0aHNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMiwgMSwgMykKbGluZXMoRGFsbGFzX2RlYXRoc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfRGFsbGFzX2RlYXRocykgIyBwYXNzZXMKIyBVc2UgYmVzdCBtb2RlbHMgdG8gZm9yZWNhc3QgZnVydGhlciBhaGVhZApmY18xMF9EYWxsYXMgPC0gc2FyaW1hLmZvcihEYWxsYXNfY2FzZXMsIG4uYWhlYWQgPSAxMCwgMiwgMSwgMCkKZmNfMTBfRGFsbGFzJHByZWQKZmNkXzEwX0RhbGxhcyA8LSBzYXJpbWEuZm9yKERhbGxhc19kZWF0aHMsIG4uYWhlYWQgPSAxMCwgMiwgMSwgMykKZmNkXzEwX0RhbGxhcyRwcmVkCiMgRWxsaXMKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KHRzRWxsaXNUWCkKRWxsaXNfY2FzZXMgPC0gdHNFbGxpc1RYWywgIkNhc2VzIl0KRWxsaXNfY2FzZXNfdHJhaW4gPC0gRWxsaXNfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyMCkpCkVsbGlzX2Nhc2VzX3Rlc3QgPC0gRWxsaXNfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpCkVsbGlzX2RlYXRocyA8LSB0c0VsbGlzVFhbLCAiRGVhdGhzIl0KRWxsaXNfZGVhdGhzX3RyYWluIDwtIEVsbGlzX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKRWxsaXNfZGVhdGhzX3Rlc3QgPC0gRWxsaXNfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfRWxsaXNfY2FzZXMgPC0gYXV0by5hcmltYShFbGxpc19jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfRWxsaXNfY2FzZXMgIyBBUklNQSgwLCAxLCA1KSwgQUlDYyAtIDUwOS4xOQphdXRvcGxvdChmaXRfRWxsaXNfY2FzZXMpCnNhcmltYS5mb3IoRWxsaXNfY2FzZXNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMCwgMSwgNSkKbGluZXMoRWxsaXNfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X0VsbGlzX2Nhc2VzKSAjIHBhc3NlcwpmaXRfRWxsaXNfZGVhdGhzIDwtIGF1dG8uYXJpbWEoRWxsaXNfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9FbGxpc19kZWF0aHMgIyBBUklNQSgxLCAxLCA0KSwgQUlDYyAtIDk0LjUKYXV0b3Bsb3QoZml0X0VsbGlzX2RlYXRocykKc2FyaW1hLmZvcihFbGxpc19kZWF0aHNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMSwgMSwgNCkKbGluZXMoRWxsaXNfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9FbGxpc19kZWF0aHMpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfRWxsaXMgPC0gc2FyaW1hLmZvcihFbGxpc19jYXNlcywgbi5haGVhZCA9IDEwLCAwLCAxLCA1KQpmY18xMF9FbGxpcyRwcmVkCmZjZF8xMF9FbGxpcyA8LSBzYXJpbWEuZm9yKEVsbGlzX2RlYXRocywgbi5haGVhZCA9IDEwLCAxLCAxLCA0KSAKZmNkXzEwX0VsbGlzJHByZWQKIyBIYXJyaXMKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KHRzSGFycmlzVFgpCkhhcnJpc19jYXNlcyA8LSB0c0hhcnJpc1RYWywgIkNhc2VzIl0KSGFycmlzX2Nhc2VzX3RyYWluIDwtIEhhcnJpc19jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKSGFycmlzX2Nhc2VzX3Rlc3QgPC0gSGFycmlzX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQpIYXJyaXNfZGVhdGhzIDwtIHRzSGFycmlzVFhbLCAiRGVhdGhzIl0KSGFycmlzX2RlYXRoc190cmFpbiA8LSBIYXJyaXNfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpIYXJyaXNfZGVhdGhzX3Rlc3QgPC0gSGFycmlzX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTMwKSkKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X0hhcnJpc19jYXNlcyA8LSBhdXRvLmFyaW1hKEhhcnJpc19jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfSGFycmlzX2Nhc2VzICMgQVJJTUEoMiwgMSwgMCksIEFJQ2MgLSAxMjMzLjI1CmF1dG9wbG90KGZpdF9IYXJyaXNfY2FzZXMpCnNhcmltYS5mb3IoSGFycmlzX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDIsIDEsIDApCmxpbmVzKEhhcnJpc19jYXNlc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfSGFycmlzX2Nhc2VzKSAjIGRvZXMgbm90IHBhc3MKZml0X0hhcnJpc19jYXNlczIgPC0gYXJpbWEoSGFycmlzX2Nhc2VzLCBvcmRlciA9IGMoMSwgMSwgNSkpCmNoZWNrcmVzaWR1YWxzKGZpdF9IYXJyaXNfY2FzZXMyKSAjIHBhc3MKZml0X0hhcnJpc19kZWF0aHMgPC0gYXV0by5hcmltYShIYXJyaXNfZGVhdGhzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9IYXJyaXNfZGVhdGhzICMgQVJJTUEoMSwgMSwgMSksIEFJQ2MgLSA0NDQuNzgKYXV0b3Bsb3QoZml0X0hhcnJpc19kZWF0aHMpCnNhcmltYS5mb3IoSGFycmlzX2RlYXRoc190cmFpbiwgbi5haGVhZCA9IDIwLCAxLCAxLCAxKQpsaW5lcyhIYXJyaXNfZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9IYXJyaXNfZGVhdGhzKSAjIHBhc3NlcwojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX0hhcnJpcyA8LSBzYXJpbWEuZm9yKEhhcnJpc19jYXNlcywgbi5haGVhZCA9IDEwLCAxLCAxLCA1KQpmY18xMF9IYXJyaXMkcHJlZApmY2RfMTBfSGFycmlzIDwtIHNhcmltYS5mb3IoSGFycmlzX2RlYXRocywgbi5haGVhZCA9IDEwLCAxLCAxLCAxKQpmY2RfMTBfSGFycmlzJHByZWQKIyBUYXJyYW50CiMgQ1JFQVRFIFRFU1QvVFJBSU4gU0VUUyBGT1IgQ0FTRVMgQU5EIERFQVRIUwphdXRvcGxvdCh0c1RhcnJhbnRUWCkKVGFycmFudF9jYXNlcyA8LSB0c1RhcnJhbnRUWFssICJDYXNlcyJdClRhcnJhbnRfY2FzZXNfdHJhaW4gPC0gVGFycmFudF9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTIwKSkKVGFycmFudF9jYXNlc190ZXN0IDwtIFRhcnJhbnRfY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEzMCkpClRhcnJhbnRfZGVhdGhzIDwtIHRzVGFycmFudFRYWywgIkRlYXRocyJdClRhcnJhbnRfZGVhdGhzX3RyYWluIDwtIFRhcnJhbnRfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjApKQpUYXJyYW50X2RlYXRoc190ZXN0IDwtIFRhcnJhbnRfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMzApKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfVGFycmFudF9jYXNlcyA8LSBhdXRvLmFyaW1hKFRhcnJhbnRfY2FzZXMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X1RhcnJhbnRfY2FzZXMgIyBBUklNQSgzLCAxLCAyKSwgQUlDYyAtIDEwNzYuOTIKYXV0b3Bsb3QoZml0X1RhcnJhbnRfY2FzZXMpCnNhcmltYS5mb3IoVGFycmFudF9jYXNlc190cmFpbiwgbi5haGVhZCA9IDIwLCAzLCAxLCAyKQpsaW5lcyhUYXJyYW50X2Nhc2VzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9UYXJyYW50X2Nhc2VzKSAjIGRvZXMgbm90IHBhc3MgTGp1bmcgQm94IHRlc3QKZml0X1RhcnJhbnRfY2FzZXMyIDwtIGFyaW1hKFRhcnJhbnRfY2FzZXMsIG9yZGVyID0gYygzLCAxLCA4KSkKY2hlY2tyZXNpZHVhbHMoZml0X1RhcnJhbnRfY2FzZXMyKSAjIHBhc3NlcwpmaXRfVGFycmFudF9kZWF0aHMgPC0gYXV0by5hcmltYShUYXJyYW50X2RlYXRocywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfVGFycmFudF9kZWF0aHMgIyBBUklNQSgyLCAxLCAzKSwgQUlDYyAtIDM3NS4zMwphdXRvcGxvdChmaXRfVGFycmFudF9kZWF0aHMpCnNhcmltYS5mb3IoVGFycmFudF9kZWF0aHNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMiwgMSwgMykKbGluZXMoVGFycmFudF9kZWF0aHNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X1RhcnJhbnRfZGVhdGhzKSAjIGRvZXMgbm90IHBhc3MKZml0X1RhcnJhbnRfZGVhdGhzMiA8LSBhcmltYShUYXJyYW50X2RlYXRocywgb3JkZXIgPSBjKDIsIDIsIDYpKQpjaGVja3Jlc2lkdWFscyhmaXRfVGFycmFudF9kZWF0aHMyKSAjIHBhc3NlcwojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX1RhcnJhbnQgPC0gc2FyaW1hLmZvcihUYXJyYW50X2Nhc2VzLCBuLmFoZWFkID0gMTAsIDMsIDEsIDgpCmZjXzEwX1RhcnJhbnQkcHJlZApmY2RfMTBfVGFycmFudCA8LSBzYXJpbWEuZm9yKFRhcnJhbnRfZGVhdGhzLCBuLmFoZWFkID0gMTAsIDIsIDIsIDYpIApmY2RfMTBfVGFycmFudCRwcmVkCmBgYApWLiBMaW5lYXIgUmVncmVzc2lvbiBvbiBNTiBjb3VudGllcyB0byBhY2NvdW50IGZvciBjb25zdGFudHMKICBBLiBMb2FkIGN1cnJlbnQgZGF0YSBhbmQgYWRkIGNvbnN0YW50IHZhcmlhYmxlcwogIEIuIFJlc2hhcGUgZGF0YSBpbnRvIGxvbmcgYW5kIHdpZGUgZm9ybXMKICBDLiBCdWlsZCBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbHMgZm9yIGNhc2VzIGFuZCBkZWF0aHMKYGBge3J9CiMgaHR0cHM6Ly9zdGF0cy5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvOTk5MDcvaG93LXRvLXRlc3QtdGhlLWluZmx1ZW5jZS1vZi1leHRlcm5hbC1mYWN0b3JzLW9uLXRpbWUtc2VyaWVzCiMgaHR0cHM6Ly9ib29rZG93bi5vcmcvY2NvbG9uZXNjdS9SUG9FNC8KIyBVU0UgVVNBRkFDVFMgQ1VNVUxBVElWRSBDQVNFUyBBTkQgREVBVEhTIEZJTEVTCiMgRVhQTE9ERSBPVVQgQ09MVU1OUyBTTyBUSEFUIEVBQ0ggUkVQUkVTRU5UUyBBIFJFQ09SRAojIEFERCBQT1BVTEFUSU9OLCBUT1RBTCBDQVNFUywgVE9UQUwgREVBVEhTCiMgUlVOIE1MIEFMR09SSVRITSBUTyBQUkVESUNUIChMSU5FQVIgUkVHKQoKIyBsb2FkIGluIE1OIGNvdW50eSBsZXZlbCBkYXRhIGZyb20gdXNhZmFjdHMgKHdpZGUgZm9ybSkKIyBodHRwOi8vd3d3LmNvb2tib29rLXIuY29tL01hbmlwdWxhdGluZ19kYXRhL0NvbnZlcnRpbmdfZGF0YV9iZXR3ZWVuX3dpZGVfYW5kX2xvbmdfZm9ybWF0LwpNTl8wNjEzIDwtIE1OXzA2MTMgJT4lIGZpbHRlcihTdGF0ZSA9PSAiTU4iKSAlPiUgZmlsdGVyKEZJUFMgIT0gIjAiKSAjIHJlbW92ZSB1bmFsbG9jYXRlZCBjYXNlcwpNTl8wNjEzIDwtIE1OXzA2MTNbLCAtKDMpXSAjIHJlbW92ZSBTdGF0ZQpzdHIoTU5fMDYxMykKdGFpbChNTl8wNjEzKQojIGxvYWQgaW4gZXh0cmEgdmFyaWFibGVzCnN0cihjb3VudHlfZGF0YSkKY291bnR5X2RhdGEgPC0gY291bnR5X2RhdGFbLCBjKDEsIDcsIDksIDEwKV0gIyByZW1vdmUgdW5uZWNlc3NhcnkgY29sdW1ucwpNTl8wNjEzX2Z1bGwgPC0gTU5fMDYxMyAlPiUgbGVmdF9qb2luKGNvdW50eV9kYXRhLCBieSA9ICJGSVBTIikKc3RyKE1OXzA2MTNfZnVsbCkKc3VtbWFyeShNTl8wNjEzX2Z1bGwpICMgbm90aWNlIHdoaWNoIGNvbHVtbnMgY29udGFpbiBub3RoaW5nIGJ1dCAwIHZhbHVlcyAoY29scyAzOjQ2KQp0YWlsKE1OXzA2MTNfZnVsbCkKTU5fMDYxM19mdWxsIDwtIE1OXzA2MTNfZnVsbFssLSgzOjQ2KV0gIyByZW1vdmUgY29sdW1ucyB3aXRoIG5vIGNhc2VzCmRhdGFfd2lkZSA8LSBhcy5kYXRhLmZyYW1lKHQoTU5fMDYxM19mdWxsKSkKY2xhc3MoZGF0YV93aWRlKQpoZWFkKGRhdGFfd2lkZSwgMSkKY29sbmFtZXMoZGF0YV93aWRlKSA8LSBNTl8wNjEzX2Z1bGwkY291bnR5bmFtZQpkYXRhX3dpZGUgPC0gZGF0YV93aWRlWy0xLCBdICMgcmVtb3ZlIGNvdW50eUZJUFMgcm93CnN0cihkYXRhX3dpZGUpCmhlYWQoZGF0YV93aWRlKQpkYXRhX2xvbmcgPC0gZ2F0aGVyKE1OXzA2MTNfZnVsbCwgZGF0ZSwgY2FzZXMsIFgzLjUuMjA6WDYuMTMuMjAsIGZhY3Rvcl9rZXkgPSBUUlVFKQpzdHIoZGF0YV9sb25nKQpzdW1tYXJ5KGRhdGFfbG9uZykKZGF0YV9sb25nJG1lYXRfcGxhbnQgPC0gYXMuZmFjdG9yKGRhdGFfbG9uZyRtZWF0X3BsYW50KQpkYXRhX2xvbmckbWVhdF9wbGFudCA8LSBhcy5udW1lcmljKGRhdGFfbG9uZyRtZWF0X3BsYW50KQpzdHIoZGF0YV9sb25nKQpkYXRhX2xvbmdbNTAwOjU1MCwgXSAjIHZpZXcgYSBwaWVjZSBvZiB0aGUgZGF0YSBmcmFtZQojIGJhc2ljIEVEQQpwbG90X251bShkYXRhX2xvbmcpCmNvcihkYXRhX2xvbmdbLCBjKDIsIDMsIDQsIDYpXSkgIyBubyBvYnZpb3VzIGNvcnJlbGF0aW9uIGJldHdlZW4gdmFyaWFibGVzLCBoaWdoZXN0IGNvciBpcyBjYXNlcyBhbmQgcG9wCnBhaXJzKGRhdGFfbG9uZ1ssIGMoMiwgMywgNCwgNildKQojIHdyaXRlLmNzdihkYXRhX2xvbmcsICJNTl8wNjEzX2Z1bGwuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCiMgd3JpdGUuY3N2KGRhdGFfd2lkZSwgIk1OXzA2MTNfZnVsbDIuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCiMgcHJlZGljdCBjYXNlcyB1c2luZyBsaW5lYXIgcmVncmVzc2lvbgojIGh0dHBzOi8vd3d3LnN0YXRtZXRob2RzLm5ldC9zdGF0cy9yZWdyZXNzaW9uLmh0bWwKIyBodHRwOi8vci1zdGF0aXN0aWNzLmNvL01vZGVsLVNlbGVjdGlvbi1pbi1SLmh0bWwKIyBodHRwczovL2Jvb2tkb3duLm9yZy9jY29sb25lc2N1L1JQb0U0L3NpbXBsZWxtLmh0bWwKbW9kMSA8LSBsbShjYXNlcyB+IC4sIGRhdGEgPSBkYXRhX2xvbmcpCnN1bW1hcnkobW9kMSkjIHZhcmlhYmxlcyBhcmUgYWxsIHNpZ25pZmljYW50IGJ1dCBhZGogUi1zcXVhcmVkIGlzIHF1aXRlIGxvdyAoMC4zOTg1KQpzZWxlY3RlZE1vZCA8LSBzdGVwKG1vZDEpICMgbm8gaW1wcm92ZW1lbnQgdG8gQUlDIHRvIGV4Y2x1ZGUgYW55IHZhcmlhYmxlCnN1bW1hcnkoc2VsZWN0ZWRNb2QpICMgYmVzdCBtb2RlbCBpbmNsdWRlcyBhbGwgdmFyaWFibGVzCiMgY2FuJ3QgdXNlIGRhdGEud2lkZSBiL2MgdGhlcmUgYXJlIHRvbyBtYW55IHZhcmlhYmxlcwojIGh0dHA6Ly93d3cuc3RoZGEuY29tL2VuZ2xpc2gvYXJ0aWNsZXMvMzgtcmVncmVzc2lvbi1tb2RlbC12YWxpZGF0aW9uLzE1Ny1jcm9zcy12YWxpZGF0aW9uLWVzc2VudGlhbHMtaW4tci8KIyBzcGxpdCBkYXRhIGludG8gdHJhaW5pbmcgYW5kIHRlc3Qgc2V0CnNldC5zZWVkKDMwNykKdHJhaW5pbmcuc2FtcGxlcyA8LSBkYXRhX2xvbmckY2FzZXMgJT4lIGNyZWF0ZURhdGFQYXJ0aXRpb24ocCA9IDAuOCwgbGlzdCA9IEZBTFNFKQpyZWdfdHJhaW4gPC0gZGF0YV9sb25nW3RyYWluaW5nLnNhbXBsZXMsIF0KcmVnX3Rlc3QgPC0gZGF0YV9sb25nWy10cmFpbmluZy5zYW1wbGVzLCBdCm1vZDIgPC0gbG0oY2FzZXMgfiAuLCBkYXRhID0gcmVnX3RyYWluKQpwcmVkIDwtIG1vZDIgJT4lIHByZWRpY3QocmVnX3Rlc3QpCmRhdGEuZnJhbWUoUjIgPSBSMihwcmVkLCByZWdfdGVzdCRjYXNlcyksCiAgICAgICAgICAgUk1TRSA9IFJNU0UocHJlZCwgcmVnX3Rlc3QkY2FzZXMpLAogICAgICAgICAgIE1BRSA9IE1BRShwcmVkLCByZWdfdGVzdCRjYXNlcykpICMgbG9vayBmb3IgbG93ZXN0IHRlc3Qgc2FtcGxlIFJNU0UsIFJvb3QgTWVhbiBTcSBFcnJvciAoMzY1LjE5MTcpClJNU0UocHJlZCwgcmVnX3Rlc3QkY2FzZXMpL21lYW4ocmVnX3Rlc3QkY2FzZXMpICMgd2Ugd2FudCB0aGlzIGFzIHNtYWxsIGFzIHBvc3NpYmxlICg0LjEyKQojIEstZm9sZCBjdgpzZXQuc2VlZCgzMDcpCnRyYWluLmNvbnRyb2wgPC0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJjdiIsIG51bWJlciA9IDEwKQptb2Q0IDwtIHRyYWluKGNhc2VzIH4gLiwgZGF0YSA9IGRhdGFfbG9uZywgbWV0aG9kID0gImxtIiwgdHJDb250cm9sID0gdHJhaW4uY29udHJvbCkKcHJpbnQobW9kNCkgIyBSTVNFIDQyMi44NDUyIGhpZ2hlciB0aGFuIGJhc2UgbW9kZWwKcHJlZDQgPC0gbW9kNCAlPiUgcHJlZGljdChyZWdfdHJhaW4pClJNU0UocHJlZDQsIHJlZ190ZXN0JGNhc2VzKS9tZWFuKHJlZ190ZXN0JGNhc2VzKSAjIDYuMTMgaGlnaGVyIHRoYW4gYmFzZSBtb2RlbAojIHJlcGVhdGVkIEstZm9sZCBjdgpzZXQuc2VlZCgzMDcpCnRyYWluLmNvbnRyb2wgPC0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJyZXBlYXRlZGN2IiwgbnVtYmVyID0gMTAsIHJlcGVhdHMgPSAzKQptb2Q1IDwtIHRyYWluKGNhc2VzIH4gLiwgZGF0YSA9IGRhdGFfbG9uZywgbWV0aG9kID0gImxtIiwgdHJDb250cm9sID0gdHJhaW4uY29udHJvbCkKcHJpbnQobW9kNSkgIyBSTVNFIDQyMi45NTQxIGhpZ2hlciB0aGFuIG90aGVyIHR3byBtb2RlbHMKcHJlZDUgPC0gbW9kNSAlPiUgcHJlZGljdChyZWdfdHJhaW4pClJNU0UocHJlZDUsIHJlZ190ZXN0JGNhc2VzKS9tZWFuKHJlZ190ZXN0JGNhc2VzKSAjIDYuMTMKCiMgUmVwZWF0IGZvciBkZWF0aHMKTU5fMDYxM2QgPC0gTU5fMDYxM2QgJT4lIGZpbHRlcihTdGF0ZSA9PSAiTU4iKSAlPiUgZmlsdGVyKGNvdW50eUZJUFMgIT0gIjAiKSAjIHJlbW92ZSB1bmFsbG9jYXRlZCBkZWF0aHMKTU5fMDYxM2QgPC0gTU5fMDYxM2RbLCAtKDMpXSAjIHJlbW92ZSBTdGF0ZQpzdHIoTU5fMDYxM2QpCnRhaWwoTU5fMDYxM2QpCiMgbG9hZCBpbiBleHRyYSB2YXJpYWJsZXMKTU5fMDYxM2RfZnVsbCA8LSBNTl8wNjEzZCAlPiUgbGVmdF9qb2luKGNvdW50eV9kYXRhLCBieSA9ICJjb3VudHlGSVBTIikKc3RyKE1OXzA2MTNkX2Z1bGwpCnN1bW1hcnkoTU5fMDYxM2RfZnVsbCkgIyBub3RpY2Ugd2hpY2ggY29sdW1ucyBjb250YWluIG5vdGhpbmcgYnV0IDAgdmFsdWVzIChjb2xzIDQ6NjIpCnRhaWwoTU5fMDYxM2RfZnVsbCkKTU5fMDYxM2RfZnVsbCA8LSBNTl8wNjEzZF9mdWxsWywtKDM6NjIpXSAjIHJlbW92ZSBjb2x1bW5zIHdpdGggbm8gY2FzZXMKZGF0YV93aWRlRCA8LSBhcy5kYXRhLmZyYW1lKHQoTU5fMDYxM2RfZnVsbCkpCmNsYXNzKGRhdGFfd2lkZUQpCmhlYWQoZGF0YV93aWRlRCwgMSkKY29sbmFtZXMoZGF0YV93aWRlRCkgPC0gTU5fMDYxM2RfZnVsbCRjb3VudHluYW1lCmRhdGFfd2lkZUQgPC0gZGF0YV93aWRlRFstMSwgXSAjIHJlbW92ZSBjb3VudHlGSVBTIHJvdwpzdHIoZGF0YV93aWRlRCkKaGVhZChkYXRhX3dpZGVEKQpkYXRhX2xvbmdEIDwtIGdhdGhlcihNTl8wNjEzZF9mdWxsLCBkYXRlLCBkZWF0aHMsIFgzLjIxLjIwOlg2LjEzLjIwLCBmYWN0b3Jfa2V5ID0gVFJVRSkKc3RyKGRhdGFfbG9uZ0QpCnN1bW1hcnkoZGF0YV9sb25nRCkKZGF0YV9sb25nRCA8LSBkYXRhX2xvbmdEWywgMjo3XSAjIGRyb3AgY291bnR5RklQUyBjb2x1bW4KZGF0YV9sb25nRCRtZWF0X3BsYW50IDwtIGFzLmZhY3RvcihkYXRhX2xvbmdEJG1lYXRfcGxhbnQpCmRhdGFfbG9uZ0QkbWVhdF9wbGFudCA8LSBhcy5udW1lcmljKGRhdGFfbG9uZ0QkbWVhdF9wbGFudCkKc3RyKGRhdGFfbG9uZ0QpCmRhdGFfbG9uZ0RbNTAwOjU1MCwgXSAjIHZpZXcgYSBwaWVjZSBvZiB0aGUgZGF0YSBmcmFtZQojIGJhc2ljIEVEQQpwbG90X251bShkYXRhX2xvbmdEKQpjb3IoZGF0YV9sb25nRFssIGMoMiwgMywgNCwgNildKSAjIG5vIG9idmlvdXMgY29ycmVsYXRpb24gYmV0d2VlbiB2YXJpYWJsZXMsIGhpZ2hlc3QgY29yIGlzIGRlYXRocyBhbmQgcG9wCnBhaXJzKGRhdGFfbG9uZ0RbLCBjKDIsIDMsIDQsIDYpXSkKIyB3cml0ZS5jc3YoZGF0YV9sb25nRCwgIk1OXzA2MTNkX2Z1bGwuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCiMgcHJlZGljdCBjYXNlcyB1c2luZyBsaW5lYXIgcmVncmVzc2lvbgptb2QxZCA8LSBsbShkZWF0aHMgfiAuLCBkYXRhID0gZGF0YV9sb25nRCkKc3VtbWFyeShtb2QxZCkjIHZhcmlhYmxlcyBhcmUgYWxsIHNpZ25pZmljYW50IGFuZCBhZGogUi1zcXVhcmVkIGlzIG9rYXkgKDAuNTYzMSkKc2VsZWN0ZWRNb2REIDwtIHN0ZXAobW9kMWQpICMgbm8gaW1wcm92ZW1lbnQgdG8gQUlDIHRvIGV4Y2x1ZGUgYW55IHZhcmlhYmxlCnN1bW1hcnkoc2VsZWN0ZWRNb2REKSAjIGJlc3QgbW9kZWwgaW5jbHVkZXMgYWxsIHZhcmlhYmxlcwojIHNwbGl0IGRhdGEgaW50byB0cmFpbmluZyBhbmQgdGVzdCBzZXQKc2V0LnNlZWQoMzA3KQp0cmFpbmluZy5zYW1wbGVzRCA8LSBkYXRhX2xvbmdEJGRlYXRocyAlPiUgY3JlYXRlRGF0YVBhcnRpdGlvbihwID0gMC44LCBsaXN0ID0gRkFMU0UpCnJlZ190cmFpbkQgPC0gZGF0YV9sb25nRFt0cmFpbmluZy5zYW1wbGVzRCwgXQpyZWdfdGVzdEQgPC0gZGF0YV9sb25nRFstdHJhaW5pbmcuc2FtcGxlc0QsIF0KbW9kMkQgPC0gbG0oZGVhdGhzIH4gLiwgZGF0YSA9IHJlZ190cmFpbkQpCnByZWREIDwtIG1vZDJEICU+JSBwcmVkaWN0KHJlZ190ZXN0RCkKZGF0YS5mcmFtZShSMiA9IFIyKHByZWRELCByZWdfdGVzdEQkZGVhdGhzKSwKICAgICAgICAgICBSTVNFID0gUk1TRShwcmVkRCwgcmVnX3Rlc3REJGRlYXRocyksCiAgICAgICAgICAgTUFFID0gTUFFKHByZWRELCByZWdfdGVzdEQkZGVhdGhzKSkgIyBsb29rIGZvciBsb3dlc3QgdGVzdCBzYW1wbGUgUk1TRSwgUm9vdCBNZWFuIFNxIEVycm9yICgzMC41OSkKUk1TRShwcmVkRCwgcmVnX3Rlc3REJGRlYXRocykvbWVhbihyZWdfdGVzdEQkZGVhdGhzKSAjIHdlIHdhbnQgdGhpcyBhcyBzbWFsbCBhcyBwb3NzaWJsZSAoNS44NykKIyBLLWZvbGQgY3YKc2V0LnNlZWQoMzA3KQp0cmFpbi5jb250cm9sIDwtIHRyYWluQ29udHJvbChtZXRob2QgPSAiY3YiLCBudW1iZXIgPSAxMCkKbW9kNEQgPC0gdHJhaW4oZGVhdGhzIH4gLiwgZGF0YSA9IGRhdGFfbG9uZ0QsIG1ldGhvZCA9ICJsbSIsIHRyQ29udHJvbCA9IHRyYWluLmNvbnRyb2wpCnByaW50KG1vZDREKSAjIFJNU0UgMC41NSBtdWNoIGxvd2VyIHRoYW4gYmFzZSBtb2RlbApwcmVkNEQgPC0gbW9kNEQgJT4lIHByZWRpY3QocmVnX3RyYWluRCkKUk1TRShwcmVkNEQsIHJlZ190ZXN0RCRkZWF0aHMpL21lYW4ocmVnX3Rlc3REJGRlYXRocykgIyA5Ljk5IGhpZ2hlciB0aGFuIGJhc2UgbW9kZWwKIyByZXBlYXRlZCBLLWZvbGQgY3YKc2V0LnNlZWQoMzA3KQp0cmFpbi5jb250cm9sIDwtIHRyYWluQ29udHJvbChtZXRob2QgPSAicmVwZWF0ZWRjdiIsIG51bWJlciA9IDEwLCByZXBlYXRzID0gMykKbW9kNUQgPC0gdHJhaW4oZGVhdGhzIH4gLiwgZGF0YSA9IGRhdGFfbG9uZ0QsIG1ldGhvZCA9ICJsbSIsIHRyQ29udHJvbCA9IHRyYWluLmNvbnRyb2wpCnByaW50KG1vZDVEKSAjIFJNU0UgMC41NSBzYW1lIGFzIGN2IG1vZGVsCnByZWQ1RCA8LSBtb2Q1RCAlPiUgcHJlZGljdChyZWdfdHJhaW5EKQpSTVNFKHByZWQ1RCwgcmVnX3Rlc3REJGRlYXRocykvbWVhbihyZWdfdGVzdEQkZGVhdGhzKSAjIDkuOTkgdmVyeSBwb29yIHByZWRpY3RvcgpgYGAKVkkuIFZlY3RvciBBdXRvcmVncmVzc2lvbiAoVkFSKQogIEEuIFBlcmZvcm0gVkFSIG9uIE1OIGNvdW50aWVzICg5KSBhbmQgc2VsZWN0IGNvdW50aWVzICgzKQogIEIuIFBlcmZvcm0gVkFSIG9uIFVTIHN0YXRlcyAoNykgYW5kIHNlbGVjdCBzdGF0ZXMoMykKICBDLiBGb3JlY2FzdCAxMiBkYXlzIG91dCBvbiBhbGwgbW9kZWxzCmBgYHtyfQojIFZBUiBmb3IgY29tYmluZWQgY291bnRpZXMgYW5kIGFkZCBpbiBvdGhlciB2YXJpYWJsZXMKIyB0cnkgbXVsdGlwbGUgY291bnRpZXMgYW5kIGZvY3VzIG9uIG9uZSB2YXJpYWJsZSAoY2FzZXMgb3IgZGVhdGhzKQojIGh0dHBzOi8vYm9va2Rvd24ub3JnL3NpbmdoX3ByYXRhcF90ZWplbmRyYS9pbnRyb190aW1lX3Nlcmllc19yL211bHRpdmFyaWF0ZS10cy1hbmFseXNpcy5odG1sCiMgaHR0cDovL3Bhc3QucmluZmluYW5jZS5jb20vYWdlbmRhLzIwMTMvdGFsay9SdWV5VHNheS5wZGYKIyBodHRwczovL3N1YnNjcmlwdGlvbi5wYWNrdHB1Yi5jb20vYm9vay9iaWdfZGF0YV9hbmRfYnVzaW5lc3NfaW50ZWxsaWdlbmNlLzk3ODE3ODM1NTIwNzgvMS9jaDAxbHZsMXNlYzA4L211bHRpdmFyaWF0ZS10aW1lLXNlcmllcy1hbmFseXNpcwoKIyB1c2UgcmVjZW50IGRhdGEgZnJvbSB1c2FmYWN0cyBhbmQgbGltaXQgdG8gY2FzZXMgYnV0IGluY2x1ZGUgbXVsdGlwbGUgY291bnRpZXMKTU5fOWN1bSA8LSBhcy5kYXRhLmZyYW1lKHQoTU5fOWN1bSkpCk1OXzljdW0gPC0gTU5fOWN1bVs1OjE0OCwgXQpjb2xuYW1lcyhNTl85Y3VtKSA8LSBjKCJBIiwgIkMiLCAiRCIsICJIIiwgIksiLCAiTiIsICJSIiwgIlMiLCAiVyIpCmRpbShNTl85Y3VtKQpzdHIoTU5fOWN1bSkKdGFpbChNTl85Y3VtKQpNTl85Y3VtIDwtIE1OXzljdW0gJT4lIG11dGF0ZV9pZihpcy5mYWN0b3IsIGFzLmNoYXJhY3RlcikKTU5fOWN1bSA8LSBNTl85Y3VtICU+JSBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5pbnRlZ2VyKQojIHRydW5jYXRlIHRvIHJlbW92ZSBkYXlzIHByaW9yIHRvIHJlcG9ydGluZyAoZmlyc3QgY2FzZSBvY2N1cnMgb24gcm93IDQ1KSAtIHBhdXNlIGIvYyBvZiBWQVIgcmVzdHJpY3Rpb25zCnRhaWwoTU5fOWN1bSwgMTUpCiMgYWRkIGNvbCB0aGF0IHNob3dzIGRpZmZlcmVuY2UgYmV0d2VlbiB2YWx1ZXMgKFVTQWZhY3RzIGRhdGEgaXMgY3VtdWxhdGl2ZSkKTU5fOSA8LSBNTl85Y3VtCnN0YXJ0ID0gMApNTl85JEFub2thIDwtIGMoc3RhcnQsIGRpZmYoTU5fOSRBKSkKTU5fOSRDbGF5IDwtIGMoc3RhcnQsIGRpZmYoTU5fOSRDKSkKTU5fOSREYWtvdGEgPC0gYyhzdGFydCwgZGlmZihNTl85JEQpKQpNTl85JEhlbm5lcGluIDwtIGMoc3RhcnQsIGRpZmYoTU5fOSRIKSkKTU5fOSRLYW5kaXlvaGkgPC0gYyhzdGFydCwgZGlmZihNTl85JEspKQpNTl85JE5vYmxlcyA8LSBjKHN0YXJ0LCBkaWZmKE1OXzkkTikpCk1OXzkkUmFtc2V5IDwtIGMoc3RhcnQsIGRpZmYoTU5fOSRSKSkKTU5fOSRTdGVhcm5zIDwtIGMoc3RhcnQsIGRpZmYoTU5fOSRTKSkKTU5fOSRXYXNoaW5ndG9uIDwtIGMoc3RhcnQsIGRpZmYoTU5fOSRXKSkKaGVhZChNTl85LCAxMCkKTU5fOSA8LSBNTl85WywgMTA6MThdCiMgY29udmVydCB0byB0cwpNTl85dHMgPC0gdHMoTU5fOSwgc3RhcnQgPSBjKDIwMjAsIDUxKSwgZnJlcXVlbmN5ID0gMzY1KQpzdHIoTU5fOXRzKQphdXRvcGxvdChNTl85dHMsIG1haW4gPSAiVGltZSBzZXJpZXMgcGxvdCBvZiB0aGUgTU5fOSBkYXRhIikKIyBkZXRlcm1pbmUgayBmb3IgYWRmLnRlc3QKdHJ1bmMoKGxlbmd0aChNTl85KS0xKV4oMS8zKSkKIyBwZXJmb3JtIGFkZi50ZXN0IHRvIGNoZWNrIGZvciBzdGF0aW9uYXJpdHkgKEgwID0gbm9uLXN0YXRpb25hcnkpCmFwcGx5KE1OXzl0cywgMiwgYWRmLnRlc3QpICMgbm9uZSBvZiB0aGUgdHMgaXMgc3RhdGlvbmFyeSB5ZXQKIyBkaWZmZXJlbmNlIHRoZSBlbnRpcmUgbXVsdGl2YXJpYXRlIHRzCk1OXzl0c2RpZmYgPC0gZGlmZk0oTU5fOSkKTU5fOVs0NTo1NSwgXQpNTl85dHNkaWZmWzQ1OjU1LCBdCmFwcGx5KE1OXzl0c2RpZmYsIDIsIGFkZi50ZXN0KSAjIG5vdyBzdGF0aW9uYXJ5IChwIHZhbHVlIDwgMC4wNSkKTU5fOXRzZGlmZiA8LSB0cyhNTl85dHNkaWZmKQphdXRvcGxvdChNTl85dHNkaWZmLCBtYWluID0gIlRpbWUgc2VyaWVzIHBsb3Qgb2YgdGhlIHN0YXRpb25hcnkgKGRpZmZlcmVuY2VkKSBNTl85dHMgZGF0YSIpCiMgbGFnIG9yZGVyIGlkZW50aWZpY2F0aW9uClZBUnNlbGVjdChNTl85dHNkaWZmLCB0eXBlID0gIm5vbmUiLCBsYWcubWF4ID0gMTUpICMgMTEgaXMgYmVzdCBsYWcgZm9yIG1vc3Qgc2VsZWN0aW9uIGNyaXRlcmlhCiMgaHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnL3BhY2thZ2VzL3ZhcnMvdmVyc2lvbnMvMS41LTMvdG9waWNzL1ZBUnNlbGVjdAojIGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy92YXJzL3ZhcnMucGRmCiMgaWYgd2UgaW5jbHVkZSBkaXN0LCBwb3AsIGFuZCBtZWF0X3BsYW50IGhlcmUsIGFyZSB0aGV5IGV4b2dlbm91cyByZWdyZXNzb3JzPwojIGNyZWF0ZSB0aGUgVkFSIG1vZGVsCnZhci5NTl85IDwtIFZBUihNTl85dHNkaWZmLCB0eXBlID0gIm5vbmUiLCBsYWcubWF4ID0gMTAsIGljID0gIkFJQyIpICMgZXJyb3JzIGFib3ZlIDEwIGR1ZSB0byBzbWFsbCBzaXplIG9mIHRzCnN1bW1hcnkodmFyLk1OXzkpICMgcmVsYXRpdmVseSBnb29kIG1vZGVsIHdpdGggbG93IHAtdmFsdWVzIGFuZCBoaWdoIGFkaiByLXNxdWFyZWQKIyBkaWFnbm9zdGljIHRlc3RzID0gUG9ydG1hbnRlYXUgVGVzdApzZXJpYWwudGVzdCh2YXIuTU5fOSkgIyBwLXZhbHVlIGJlbG93IDAuMDUgaW5kaWNhdGVzIHdlIGhhdmUgYXV0b2NvcnJlbGF0aW9uIGluIGVycm9ycwojIEdyYW5nZXIgdGVzdCBmb3IgY2F1c2FsaXR5IChhbGwgc2hvdyBjYXVzYWxpdHkpCmNhdXNhbGl0eSh2YXIuTU5fOSwgY2F1c2UgPSBjKCJBbm9rYSIpKSAjIHRoZXJlIGlzIGNhdXNhbGl0eSAobG93IHAtdmFsdWVzIGZvciBib3RoIEdyYW5nZXIgYW5kIEluc3RhbnQpCmNhdXNhbGl0eSh2YXIuTU5fOSwgY2F1c2UgPSBjKCJDbGF5IikpICMgdGhlcmUgaXMgY2F1c2FsaXR5IChsb3cgcC12YWx1ZXMgZm9yIGJvdGggR3JhbmdlciBhbmQgSW5zdGFudCkKY2F1c2FsaXR5KHZhci5NTl85LCBjYXVzZSA9IGMoIkRha290YSIpKSAjIHRoZXJlIGlzIGNhdXNhbGl0eSAobG93IHAtdmFsdWVzIGZvciBib3RoIEdyYW5nZXIgYW5kIEluc3RhbnQpCmNhdXNhbGl0eSh2YXIuTU5fOSwgY2F1c2UgPSBjKCJIZW5uZXBpbiIpKSAjIGNhdXNhbGl0eSwgc2lnbmlmaWNhbnQKY2F1c2FsaXR5KHZhci5NTl85LCBjYXVzZSA9IGMoIkthbmRpeW9oaSIpKSAjIGNhdXNhbGl0eQpjYXVzYWxpdHkodmFyLk1OXzksIGNhdXNlID0gYygiTm9ibGVzIikpICMgY2F1c2FsaXR5CmNhdXNhbGl0eSh2YXIuTU5fOSwgY2F1c2UgPSBjKCJSYW1zZXkiKSkgIyBjYXVzYWxpdHkKY2F1c2FsaXR5KHZhci5NTl85LCBjYXVzZSA9IGMoIlN0ZWFybnMiKSkgIyBjYXVzYWxpdHkKY2F1c2FsaXR5KHZhci5NTl85LCBjYXVzZSA9IGMoIldhc2hpbmd0b24iKSkgIyBjYXVzYWxpdHkKIyBvdGhlciBkaWFnbm9zdGljIHRlc3RzCmFyY2gudGVzdCh2YXIuTU5fOSkgIyB0ZXN0IGZvciBhdXRvcmVncmVzc2l2ZSBjb25kaXRpb25hbCBoZXRlcm9zY2VkYXN0aWNpdHkgKEFSQ0gpLCBwLXZhbHVlID0gMQpub3JtYWxpdHkudGVzdCh2YXIuTU5fOSkgIyBwLXZhbHVlIGJlbG93IDAuMDUKIyB0cnkgcCA9IDUgYi9jIHRoYXQncyB3aGF0IHRoZSBBdWdtZW50ZWQgRGlja2V5LUZ1bGxlciB0ZXN0IGluZGljYXRlZAp2YXIuTU5fOWEgPC0gVkFSKE1OXzl0c2RpZmYsIHR5cGUgPSAibm9uZSIsIHAgPSA1KQpzZXJpYWwudGVzdCh2YXIuTU5fOWEpICMgcC12YWx1ZSBpcyBzYW1lIGFzIG9yaWdpbmFsIG1vZGVsLCBtdWNoIHRvbyBsb3cKIyBldmVuIHRob3VnaCBib3RoIG1vZGVscyBoYXZlIGZsYXdzLCB1c2Ugb3JpZ2luYWwgbW9kZWwgdG8gZm9yZWNhc3QgCmZjYXN0TU5fOSA8LSBwcmVkaWN0KHZhci5NTl85LCBuLmFoZWFkID0gMTIpICMgcHJlZGljdCB0aHJvdWdoIDA2LjI1LjIwCmZjYXN0TU5fOSAjIHZhbHVlcyBzZWVtIHRvIGJlIHZvbGF0aWxlIGNvbnNpZGVyaW5nIHNvbWUgY291bnRpZXMgaGF2ZSBzbWFsbCAjJ3Mgb2YgY2FzZXMgYXQgdGFpbCBvZiBkYXRhCnBhcihtYXIgPSBjKDAuNSwgMC41LCAwLjUsIDAuNSkpCnBsb3QoZmNhc3RNTl85KSAjIGZvcmVjYXN0cyBhcmUgbXVjaCB0b28gdmFyaWVkIGNvbXBhcmVkIHRvIGRpZmZlcmVuY2VkIGRhdGEKIyBwdWxsIG91dCBqdXN0IHRoZSBIZW5uZXBpbiBjb3VudHkgZmNhc3RzCkhlbm5lcGluIDwtIGZjYXN0TU5fOSRmY3N0WzRdOyBIZW5uZXBpbgpIZW5uZXBpbiA8LSBIZW5uZXBpbiRIZW5uZXBpblssIDFdOyBIZW5uZXBpbgojIEludmVydCB0aGUgZGlmZmVyZW5jaW5nIChhZGQgdGhlIGxhc3QgdmFsdWUgb2YgdGhlIHRzIGRhdGEgdG8gdGhlIGZvcmVjYXN0cykKdGFpbChNTl85KSAjIGNhc2VzIGFkZGVkIGVhY2ggZGF5IC0gdXNlIHRoaXMgIyBiL2Mgd2UgZGlmZmVyZW5jZWQgdGhpcyBkYXRhCnRhaWwoTU5fOWN1bSkgIyB0b3RhbCBjYXNlcwpIZW5uZXBpbiA8LSBIZW5uZXBpbiArIDEzNQpIZW5uZXBpbiAjIG1hbnkgb2YgdGhlc2UgYXJlIGltcG9zc2libGUgIydzIGJlY2F1c2UgbG93ZXN0IHBvc3NpYmxlIGlzIDAKcGFyKG1mcm93ID0gYygxLCAxKSkKcGxvdC50cyhIZW5uZXBpbikKIyBhZGQgZGF0YSBhbmQgZm9yZWNhc3QgdG8gb25lIHRpbWUgc2VyaWVzCkhlbm5fZnVsbCA8LSB0cyhjKE1OXzlbLCA0XSwgSGVubmVwaW4pLCBzdGFydCA9IGMoMjAyMCwgMjIpLCBmcmVxdWVuY3kgPSAzNjUpCnBsb3QoSGVubl9mdWxsKQojIG5vdCBhIGdvb2QgbW9kZWwgYXQgYWxsISAKIyBGaXJzdCwgdHJ1bmNhdGUgZGF0YSBhbmQgdXNlIGxvd2VyIHAgaW4gVkFSIG1vZGVsIChiZWNhdXNlIGRhdGEgaXMgc21hbGxlcikgLSBmaXJzdCBjYXNlIGFwcGVhcnMgb24gZGF5IDQ1Ck1OXzliPC0gTU5fOVs0NToxNDQsIF0KTU5fOWJkaWZmIDwtIGRpZmZNKE1OXzliKQpNTl85YnRzZGlmZiA8LSB0cyhNTl85YmRpZmYpCmF1dG9wbG90KE1OXzlidHNkaWZmLCBtYWluID0gIlRpbWUgc2VyaWVzIHBsb3Qgb2YgdGhlIHN0YXRpb25hcnkgKGRpZmZlcmVuY2VkKSBNTl85dHMgZGF0YSwgdHJ1bmNhdGVkIikKIyBsYWcgb3JkZXIgaWRlbnRpZmljYXRpb24KVkFSc2VsZWN0KE1OXzlidHNkaWZmLCB0eXBlID0gIm5vbmUiLCBsYWcubWF4ID0gOSkgIyA5IGlzIGJlc3QgbGFnIGZvciAgc2VsZWN0aW9uIGNyaXRlcmlhCiMgY3JlYXRlIHRoZSBWQVIgbW9kZWwKdmFyLk1OXzliIDwtIFZBUihNTl85YnRzZGlmZiwgdHlwZSA9ICJub25lIiwgbGFnLm1heCA9IDksIGljID0gIkFJQyIpICMgZXJyb3JzIGFib3ZlIDEwIGR1ZSB0byBzbWFsbCBzaXplIG9mIHRzCnN1bW1hcnkodmFyLk1OXzliKQojIGRpYWdub3N0aWMgdGVzdHMgPSBQb3J0bWFudGVhdSBUZXN0CnNlcmlhbC50ZXN0KHZhci5NTl85YikgIyBwLXZhbHVlIGJlbG93IDAuMDUgc3RpbGwKI1RyeSBmZXdlciBjb3VudGllcz8KIyB1c2UgSGVubmVwaW4sIEthbmRpeW9oaSwgYW5kIFN0ZWFybnMgKG15IGh5cG90aGVzaXMgaXMgdGhhdCBIZW5uIGlzIGxhZ2dpbmcgaW5kaWNhdG9yIGZvciBLYW5kaSBhbmQgU3RlYXJucykKTU5fMyA8LSBNTl85YlssIGMoNCwgNSwgOCldCk1OXzNkaWZmIDwtIGRpZmZNKE1OXzMpCk1OXzN0c2RpZmYgPC0gdHMoTU5fM2RpZmYsIHN0YXJ0ID0gYygyMDIwLCA0NSksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QoTU5fM3RzZGlmZiwgbWFpbiA9ICJUaW1lIHNlcmllcyBwbG90IG9mIHRoZSBzdGF0aW9uYXJ5IChkaWZmZXJlbmNlZCkgTU5fMyBkYXRhIikKIyBidWlsZCBtb2RlbApWQVJzZWxlY3QoTU5fM3RzZGlmZiwgdHlwZSA9ICJub25lIikgIyB0cnkgOSAoY2FuJ3QgZG8gMTAgYi9jIG9mIGVycm9yKQp2YXIuTU5fMyA8LSBWQVIoTU5fM3RzZGlmZiwgdHlwZSA9ICJub25lIiwgcCA9IDkpCnNlcmlhbC50ZXN0KHZhci5NTl8zKSAjIHAtdmFsdWUgdG9vIGxvdwojIGdlbmVyYXRlIGltcHVsc2UgcmVzcG9uc2UgZnVuY3Rpb25zIHRvIGRlc2NyaWJlIHJlc3BvbnNlIG9mIFN0ZWFybnMgdG8gSGVubmVwaW4gY2hhbmdlcwojIGh0dHBzOi8va2V2aW5rb3R6ZS5naXRodWIuaW8vdHMtNy10dXQvCiMgaHR0cHM6Ly93d3cuci1lY29ub21ldHJpY3MuY29tL3RpbWVzZXJpZXMvdmFyaW50cm8vIAppcmYuc3RlYXJucyA8LSBpcmYodmFyLk1OXzMsIG4uYWhlYWQgPSAxMiwgaW1wdWxzZSA9ICJIZW5uZXBpbiIsIHJlc3BvbnNlID0gIlN0ZWFybnMiLCBydW5zID0gNTAwKQpwbG90KGlyZi5zdGVhcm5zLCB5bGFiID0gIlN0ZWFybnMgQ2FzZXMiLCBtYWluID0gIlNob2NrIGZyb20gSGVubmVwaW4gQ2FzZXMiKQppcmYuaGVubmVwaW4gPC0gaXJmKHZhci5NTl8zLCBpbXB1bHNlID0gIlN0ZWFybnMiLCByZXNwb25zZSA9ICJIZW5uZXBpbiIsIG4uYWhlYWQgPSAxMiwgcnVucyA9IDUwMCkKcGxvdChpcmYuaGVubmVwaW4sIHlsYWIgPSAiSGVubmVwaW4gQ2FzZXMiLCBtYWluID0gIlNob2NrIGZyb20gU3RlYXJucyBDYXNlcyIpCmlyZi5oZW5uMiA8LSBpcmYodmFyLk1OXzMsIGltcHVsc2UgPSAiSGVubmVwaW4iLCByZXNwb25zZSA9ICJIZW5uZXBpbiIsIG4uYWhlYWQgPSAxMiwgcnVucyA9IDUwMCkKcGxvdChpcmYuaGVubjIsIHlsYWIgPSAiSGVubmVwaW4gQ2FzZXMiLCBtYWluID0gIlNob2NrIGZyb20gSGVubmVwaW4gQ2FzZXMiKQpNTl8zLnZhcmRlYyA8LSBmZXZkKHZhci5NTl8zLCBuLmFoZWFkID0gMTIpICMgZm9yZWNhc3QgZXJyb3IgdmFyaWFuY2UgZGVjb21wb3NpdGlvbnMKcGxvdChNTl8zLnZhcmRlYykKIyB2aWV3IGZvcmVjYXN0cyB1c2luZyBNTl8zIG1vZGVsIFZBUig5KQpmY2FzdE1OXzMgPC0gcHJlZGljdCh2YXIuTU5fMywgbi5haGVhZCA9IDEyKSAjIHByZWRpY3QgdGhyb3VnaCAwNi4yNS4yMApmY2FzdE1OXzMgIyBiZXR0ZXIgdGhhbiBmdWxsIG1vZGVsCnBsb3QoZmNhc3RNTl8zLCBuYW1lcyA9ICJTdGVhcm5zIikgCnBsb3QoZmNhc3RNTl8zLCBuYW1lcyA9ICJIZW5uZXBpbiIpCnBsb3QoZmNhc3RNTl8zLCBuYW1lcyA9ICJLYW5kaXlvaGkiKQpmYW5jaGFydChmY2FzdE1OXzMpCiMgcHVsbCBvdXQganVzdCB0aGUgSGVubmVwaW4gY291bnR5IGZjYXN0cwpIZW5uZXBpbjMgPC0gZmNhc3RNTl8zJGZjc3RbMV07IEhlbm5lcGluCkhlbm5lcGluMyA8LSBIZW5uZXBpbjMkSGVubmVwaW5bLCAxXTsgSGVubmVwaW4KIyBJbnZlcnQgdGhlIGRpZmZlcmVuY2luZyAoYWRkIHRoZSBsYXN0IHZhbHVlIG9mIHRoZSB0cyBkYXRhIHRvIHRoZSBmb3JlY2FzdHMpCnRhaWwoTU5fOSkgIyBjYXNlcyBhZGRlZCBlYWNoIGRheSAtIHVzZSB0aGlzICMgYi9jIHdlIGRpZmZlcmVuY2VkIHRoaXMgZGF0YQp0YWlsKE1OXzljdW0pICMgdG90YWwgY2FzZXMKSGVubmVwaW4zIDwtIEhlbm5lcGluMyArIDEzNQpIZW5uZXBpbjMgIyB0aGVzZSB2YWx1ZXMgc2VlbSBtb3JlIHJlYWxpc3RpYwpwYXIobWZyb3cgPSBjKDEsIDEpKQpwbG90LnRzKEhlbm5lcGluMykKIyBhZGQgZGF0YSBhbmQgZm9yZWNhc3QgdG8gb25lIHRpbWUgc2VyaWVzCkhlbm4zX2Z1bGwgPC0gdHMoYyhNTl8zWywgMV0sIEhlbm5lcGluMyksIHN0YXJ0ID0gYygyMDIwLCA0NSksIGZyZXF1ZW5jeSA9IDM2NSkKcGxvdChIZW5uM19mdWxsKQojIG1vZGVsIGxvb2tzIHNvbWV3aGF0IGJldHRlcgojIHZpZXcgS2FuZGl5b2hpIGFuZCBTdGVhcm5zIGRhdGEKS2FuZGkzIDwtIGZjYXN0TU5fMyRmY3N0WzJdCkthbmRpMyA8LSBLYW5kaTMkS2FuZGl5b2hpWywgMV0KS2FuZGkzIDwtIEthbmRpMyArIDMKS2FuZGkzICMgc29tZSBuZWdhdGl2ZSB2YWx1ZXMgKGNhc2VzIGNhbm5vdCBiZSBiZWxvdyAwKQpLYW5kaTNfZnVsbCA8LSB0cyhjKE1OXzNbLCAyXSwgS2FuZGkzKSwgc3RhcnQgPSBjKDIwMjAsIDQ1KSwgZnJlcXVlbmN5ID0gMzY1KQpwbG90KEthbmRpM19mdWxsKQpTdGVhcm5zMyA8LSBmY2FzdE1OXzMkZmNzdFszXQpTdGVhcm5zMyA8LSBTdGVhcm5zMyRTdGVhcm5zWywgMV0KU3RlYXJuczMgPC0gU3RlYXJuczMgKyA0ClN0ZWFybnMzICMgbmVnYXRpdmUgdmFsdWUKU3RlYXJuczNfZnVsbCA8LSB0cyhjKE1OXzNbLCAzXSwgU3RlYXJuczMpLCBzdGFydCA9IGMoMjAyMCwgNDUpLCBmcmVxdWVuY3kgPSAzNjUpCnBsb3QoU3RlYXJuczNfZnVsbCkKIyBhZGQgcG9wLCBkaXN0YW5jZSwgYW5kIG1lYXRfcGxhbnQgdG8gMyBjb3VudGllcyB0byBzZWUgaWYgdGhleSBhcmUgZXhvZ2Vub3VzIHJlZ3Jlc3NvcnMKTU5fOQpNTl8zYiA8LSBNTl8zCiMgcXVlcnkgcG9wLCBkaXN0LCBhbmQgbWVhdF9wbGFudCBmcm9tIE1OXzA2MTNfZnVsbCAoZnJvbSBNTmNvdW50aWVzLnJlZ3Jlc3Npb24uUiBjb2RlKQp0YWlsKE1OXzljdW0pCkhlbm5WYXJpYWJsZXMgPC0gTU5kYXRhX2Z1bGwgJT4lIGZpbHRlcihDb3VudHkgPT0gIkhlbm5lcGluIikgJT4lIGZpbHRlcihEYXRlID09ICI1LzkvMjAiKQpIZW5uVmFyaWFibGVzICMgcG9wID0gMTI2NTg0MywgZGlzdCA9IDAsIG1lYXQgPSBOCkthbmRpVmFyaWFibGVzIDwtIE1OZGF0YV9mdWxsICU+JSBmaWx0ZXIoQ291bnR5ID09ICJLYW5kaXlvaGkiKSAlPiUgZmlsdGVyKERhdGUgPT0gIjUvOS8yMCIpCkthbmRpVmFyaWFibGVzICMgcG9wID0gNDMxOTksIGRpc3QgPSA3NS4zMiwgbWVhdCA9IFkKU3RlYXJuc1ZhcmlhYmxlcyA8LSBNTmRhdGFfZnVsbCAlPiUgZmlsdGVyKENvdW50eSA9PSAiU3RlYXJucyIpICU+JSBmaWx0ZXIoRGF0ZSA9PSAiNS85LzIwIikKU3RlYXJuc1ZhcmlhYmxlcyAjIHBvcCA9IDE2MTA3NSwgZGlzdCA9IDY2Ljk4LCBtZWF0ID0gWQpNTl8zYiRIZW5uUG9wIDwtIDEyNjU4NDMKTU5fM2IkSGVubkRpc3QgPC0gMApNTl8zYiRIZW5uTWVhdCA8LSAxCk1OXzNiJEthbmRpUG9wIDwtIDQzMTk5Ck1OXzNiJEthbmRpRGlzdCA8LSA3NS4zMgpNTl8zYiRLYW5kaU1lYXQgPC0gMgpNTl8zYiRTdGVhcm5zUG9wIDwtIDE2MTA3NQpNTl8zYiRTdGVhcm5zRGlzdCA8LSA2Ni45OApNTl8zYiRTdGVhcm5zTWVhdCA8LSAyCk1OXzNiCiMgYnVpbGQgbmV3IFZBUiBtb2RlbCB3aXRoIE1OXzNiCk1OXzNidHNkaWZmIDwtIHRzKGRpZmZNKE1OXzNiKSwgc3RhcnQgPSBjKDIwMjAsIDQ1KSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdChNTl8zYnRzZGlmZiwgbWFpbiA9ICJUaW1lIHNlcmllcyBwbG90IG9mIHRoZSBzdGF0aW9uYXJ5IChkaWZmZXJlbmNlZCkgTU5fM2IgZGF0YSIpClZBUnNlbGVjdChNTl8zYnRzZGlmZiwgdHlwZSA9ICJ0cmVuZCIpICMgY2Fubm90IGJ1aWxkIG1vZGVsIChhbGwgc2NvcmVzID0gLUluZikKdmFyLk1OXzNiIDwtIFZBUihNTl8zYnRzZGlmZiwgdHlwZSA9ICJub25lIiwgcCA9IDEpCnNlcmlhbC50ZXN0KHZhci5NTl8zYikgIyBlcnJvcgojIENPTlNUQU5UUyBjYW5ub3QgYmUgYWRkZWQgdG8gVkFSIE1vZGVscyAtIGxvb2sgaW50byByZWdyZXNzaW9uIG1vZGVsIG9yIHhyZWcgaW4gQVJJTUEgKEFSSU1BWCkKCiMgdXNlIHJlY2VudCBkYXRhIGZyb20gdXNhZmFjdHMgYW5kIGxpbWl0IHRvIGRlYXRocyBidXQgaW5jbHVkZSBtdWx0aXBsZSBjb3VudGllcwpNTl85ZGN1bSA8LSBhcy5kYXRhLmZyYW1lKHQoTU5fOWRjdW0pKQpNTl85ZGN1bSA8LSBNTl85ZGN1bVs1OjE0OCwgXQpjb2xuYW1lcyhNTl85ZGN1bSkgPC0gYygiQSIsICJDIiwgIkQiLCAiSCIsICJLIiwgIk4iLCAiUiIsICJTIiwgIlciKQpkaW0oTU5fOWRjdW0pCnN0cihNTl85ZGN1bSkKdGFpbChNTl85ZGN1bSkKTU5fOWRjdW0gPC0gTU5fOWRjdW0gJT4lIG11dGF0ZV9pZihpcy5mYWN0b3IsIGFzLmNoYXJhY3RlcikKTU5fOWRjdW0gPC0gTU5fOWRjdW0gJT4lIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLmludGVnZXIpCmhlYWQoTU5fOWRjdW0sIDYwKQojIHRydW5jYXRlIHRvIHJlbW92ZSBkYXlzIHByaW9yIHRvIHJlcG9ydGluZyAoZmlyc3QgZGVhdGggb2NjdXJzIG9uIHJvdyA1OSkKTU5fOWRjdW0gPC0gTU5fOWRjdW1bNTg6MTQ0LCBdCnRhaWwoTU5fOWRjdW0sIDE1KQojIGFkZCBjb2wgdGhhdCBzaG93cyBkaWZmZXJlbmNlIGJldHdlZW4gdmFsdWVzIChVU0FmYWN0cyBkYXRhIGlzIGN1bXVsYXRpdmUpCk1OXzlkIDwtIE1OXzlkY3VtCnN0YXJ0ID0gMApNTl85ZCRBbm9rYSA8LSBjKHN0YXJ0LCBkaWZmKE1OXzlkJEEpKQpNTl85ZCRDbGF5IDwtIGMoc3RhcnQsIGRpZmYoTU5fOWQkQykpCk1OXzlkJERha290YSA8LSBjKHN0YXJ0LCBkaWZmKE1OXzlkJEQpKQpNTl85ZCRIZW5uZXBpbiA8LSBjKHN0YXJ0LCBkaWZmKE1OXzlkJEgpKQpNTl85ZCRLYW5kaXlvaGkgPC0gYyhzdGFydCwgZGlmZihNTl85ZCRLKSkKTU5fOWQkTm9ibGVzIDwtIGMoc3RhcnQsIGRpZmYoTU5fOWQkTikpCk1OXzlkJFJhbXNleSA8LSBjKHN0YXJ0LCBkaWZmKE1OXzlkJFIpKQpNTl85ZCRTdGVhcm5zIDwtIGMoc3RhcnQsIGRpZmYoTU5fOWQkUykpCk1OXzlkJFdhc2hpbmd0b24gPC0gYyhzdGFydCwgZGlmZihNTl85ZCRXKSkKaGVhZChNTl85ZCwgMTApCk1OXzlkIDwtIE1OXzlkWywgMTA6MThdCiMgY29udmVydCB0byB0cwpNTl85ZHRzIDwtIHRzKE1OXzlkLCBzdGFydCA9IGMoMjAyMCwgNTgpLCBmcmVxdWVuY3kgPSAzNjUpCnN0cihNTl85ZHRzKQphdXRvcGxvdChNTl85ZHRzLCBtYWluID0gIlRpbWUgc2VyaWVzIHBsb3Qgb2YgdGhlIE1OXzkgZGF0YSIpCiMgZGV0ZXJtaW5lIGsgZm9yIGFkZi50ZXN0CnRydW5jKChsZW5ndGgoTU5fOWQpLTEpXigxLzMpKQojIHBlcmZvcm0gYWRmLnRlc3QgdG8gY2hlY2sgZm9yIHN0YXRpb25hcml0eSAoSDAgPSBub24tc3RhdGlvbmFyeSkKYXBwbHkoTU5fOWR0cywgMiwgYWRmLnRlc3QpICMgbm9uZSBvZiB0aGUgdHMgaXMgc3RhdGlvbmFyeSB5ZXQKIyBkaWZmZXJlbmNlIHRoZSBlbnRpcmUgbXVsdGl2YXJpYXRlIHRzCk1OXzlkdHNkaWZmIDwtIGRpZmZNKE1OXzlkKQpNTl85ZFs0NTo1NSwgXQpNTl85ZHRzZGlmZls0NTo1NSwgXQphcHBseShNTl85ZHRzZGlmZiwgMiwgYWRmLnRlc3QpICMgbm93IHN0YXRpb25hcnkgKHAgdmFsdWUgPCAwLjA1KQpNTl85ZHRzZGlmZiA8LSB0cyhNTl85ZHRzZGlmZikKYXV0b3Bsb3QoTU5fOWR0c2RpZmYsIG1haW4gPSAiVGltZSBzZXJpZXMgcGxvdCBvZiB0aGUgc3RhdGlvbmFyeSAoZGlmZmVyZW5jZWQpIE1OXzl0cyBkYXRhIikKIyBsYWcgb3JkZXIgaWRlbnRpZmljYXRpb24KVkFSc2VsZWN0KE1OXzlkdHNkaWZmLCB0eXBlID0gIm5vbmUiLCBsYWcubWF4ID0gMTUpICMgOCBpcyBiZXN0IGxhZyBmb3IgYWxsIHNlbGVjdGlvbiBjcml0ZXJpYQojIGNyZWF0ZSB0aGUgVkFSIG1vZGVsCnZhci5NTl85ZCA8LSBWQVIoTU5fOWR0c2RpZmYsIHR5cGUgPSAibm9uZSIsIGxhZy5tYXggPSA4LCBpYyA9ICJBSUMiKSAjIGVycm9ycyBhYm92ZSAxMCBkdWUgdG8gc21hbGwgc2l6ZSBvZiB0cwpzdW1tYXJ5KHZhci5NTl85ZCkgIyByZWxhdGl2ZWx5IGdvb2QgbW9kZWwgd2l0aCBsb3cgcC12YWx1ZXMgYW5kIGhpZ2ggYWRqIHItc3F1YXJlZAojIGRpYWdub3N0aWMgdGVzdHMgPSBQb3J0bWFudGVhdSBUZXN0CnNlcmlhbC50ZXN0KHZhci5NTl85ZCkgIyBwLXZhbHVlIGJlbG93IDAuMDUgaW5kaWNhdGVzIHdlIGhhdmUgYXV0b2NvcnJlbGF0aW9uIGluIGVycm9ycwojIEdyYW5nZXIgdGVzdCBmb3IgY2F1c2FsaXR5IChhbGwgc2hvdyBjYXVzYWxpdHkpCmNhdXNhbGl0eSh2YXIuTU5fOWQsIGNhdXNlID0gYygiQW5va2EiKSkgIyB0aGVyZSBpcyBjYXVzYWxpdHkgKGxvdyBwLXZhbHVlcyBmb3IgYm90aCBHcmFuZ2VyIGFuZCBJbnN0YW50KQpjYXVzYWxpdHkodmFyLk1OXzlkLCBjYXVzZSA9IGMoIkNsYXkiKSkgIyB0aGVyZSBpcyBjYXVzYWxpdHkgKGxvdyBwLXZhbHVlcyBmb3IgYm90aCBHcmFuZ2VyIGFuZCBJbnN0YW50KQpjYXVzYWxpdHkodmFyLk1OXzlkLCBjYXVzZSA9IGMoIkRha290YSIpKSAjIHRoZXJlIGlzIGNhdXNhbGl0eSAobG93IHAtdmFsdWVzIGZvciBib3RoIEdyYW5nZXIgYW5kIEluc3RhbnQpCmNhdXNhbGl0eSh2YXIuTU5fOWQsIGNhdXNlID0gYygiSGVubmVwaW4iKSkgIyBjYXVzYWxpdHksIHNpZ25pZmljYW50CmNhdXNhbGl0eSh2YXIuTU5fOWQsIGNhdXNlID0gYygiS2FuZGl5b2hpIikpICMgY2F1c2FsaXR5CmNhdXNhbGl0eSh2YXIuTU5fOWQsIGNhdXNlID0gYygiTm9ibGVzIikpICMgY2F1c2FsaXR5CmNhdXNhbGl0eSh2YXIuTU5fOWQsIGNhdXNlID0gYygiUmFtc2V5IikpICMgY2F1c2FsaXR5CmNhdXNhbGl0eSh2YXIuTU5fOWQsIGNhdXNlID0gYygiU3RlYXJucyIpKSAjIGNhdXNhbGl0eQpjYXVzYWxpdHkodmFyLk1OXzlkLCBjYXVzZSA9IGMoIldhc2hpbmd0b24iKSkgIyBjYXVzYWxpdHkKIyBvdGhlciBkaWFnbm9zdGljIHRlc3RzCmFyY2gudGVzdCh2YXIuTU5fOWQpICMgdGVzdCBmb3IgYXV0b3JlZ3Jlc3NpdmUgY29uZGl0aW9uYWwgaGV0ZXJvc2NlZGFzdGljaXR5IChBUkNIKSwgcC12YWx1ZSA9IDEKbm9ybWFsaXR5LnRlc3QodmFyLk1OXzlkKSAjIHAtdmFsdWUgYmVsb3cgMC4wNQojIHVzZSBvcmlnaW5hbCBtb2RlbCB0byBmb3JlY2FzdCBkZWF0aHMKZmNhc3RNTl85ZCA8LSBwcmVkaWN0KHZhci5NTl85ZCwgbi5haGVhZCA9IDEyKSAjIHByZWRpY3QgdGhyb3VnaCAwNi4yNS4yMApmY2FzdE1OXzlkCnBhcihtYXIgPSBjKDAuNSwgMC41LCAwLjUsIDAuNSkpCnBsb3QoZmNhc3RNTl85ZCkgIyBmb3JlY2FzdHMgYXJlIG11Y2ggdG9vIHZhcmllZCBjb21wYXJlZCB0byBkaWZmZXJlbmNlZCBkYXRhIChzYW1lIHByb2JsZW0gYXMgY2FzZXMgVkFSIG1vZGVsKQojIHB1bGwgb3V0IGp1c3QgdGhlIEhlbm5lcGluIGNvdW50eSBmY2FzdHMKSGVubmVwaW5EIDwtIGZjYXN0TU5fOWQkZmNzdFs0XTsgSGVubmVwaW4KSGVubmVwaW5EIDwtIEhlbm5lcGluRCRIZW5uZXBpblssIDFdOyBIZW5uZXBpbgojIEludmVydCB0aGUgZGlmZmVyZW5jaW5nIChhZGQgdGhlIGxhc3QgdmFsdWUgb2YgdGhlIHRzIGRhdGEgdG8gdGhlIGZvcmVjYXN0cykKdGFpbChNTl85ZCkgIyBjYXNlcyBhZGRlZCBlYWNoIGRheSAtIHVzZSB0aGlzICMgYi9jIHdlIGRpZmZlcmVuY2VkIHRoaXMgZGF0YQp0YWlsKE1OXzlkY3VtKSAjIHRvdGFsIGNhc2VzCkhlbm5lcGluRCA8LSBIZW5uZXBpbkQgKyA0Ckhlbm5lcGluRCAjIG1hbnkgb2YgdGhlc2UgYXJlIGltcG9zc2libGUgIydzIGJlY2F1c2UgbG93ZXN0IHBvc3NpYmxlIGlzIDAKcGFyKG1mcm93ID0gYygxLCAxKSkKcGxvdC50cyhIZW5uZXBpbkQpCiMgYWRkIGRhdGEgYW5kIGZvcmVjYXN0IHRvIG9uZSB0aW1lIHNlcmllcwpIZW5uX2Z1bGxkIDwtIHRzKGMoTU5fOWRbLCA0XSwgSGVubmVwaW5EKSwgc3RhcnQgPSBjKDIwMjAsIDU4KSwgZnJlcXVlbmN5ID0gMzY1KQpwbG90KEhlbm5fZnVsbGQpICMgZmFyIHRvbyB2b2xhdGlsZQojIG5vdCBhIGdvb2QgbW9kZWwgYXQgYWxsISAKI1RyeSAzIGNvdW50aWVzCiMgdXNlIEhlbm5lcGluLCBLYW5kaXlvaGksIGFuZCBTdGVhcm5zIChteSBoeXBvdGhlc2lzIGlzIHRoYXQgSGVubiBpcyBsYWdnaW5nIGluZGljYXRvciBmb3IgS2FuZGkgYW5kIFN0ZWFybnMpCk1OXzNkIDwtIE1OXzlkWywgYyg0LCA1LCA4KV0KTU5fM2RkaWZmIDwtIGRpZmZNKE1OXzNkKQpNTl8zZHRzZGlmZiA8LSB0cyhNTl8zZGRpZmYsIHN0YXJ0ID0gYygyMDIwLCA1OCksIGZyZXF1ZW5jeSA9IDM2NSkKYXV0b3Bsb3QoTU5fM2R0c2RpZmYsIG1haW4gPSAiVGltZSBzZXJpZXMgcGxvdCBvZiB0aGUgc3RhdGlvbmFyeSAoZGlmZmVyZW5jZWQpIE1OXzNkIGRhdGEiKQojIGJ1aWxkIG1vZGVsClZBUnNlbGVjdChNTl8zZHRzZGlmZiwgdHlwZSA9ICJub25lIikgIyA4LCAyLCAxCnZhci5NTl8zZCA8LSBWQVIoTU5fM2R0c2RpZmYsIHR5cGUgPSAibm9uZSIsIGljID0gIkFJQyIpCnNlcmlhbC50ZXN0KHZhci5NTl8zZCkgIyBwLXZhbHVlIHRvbyBsb3cgKGJ1dCBiZXR0ZXIgdGhhbiBjYXNlcyBtb2RlbCkKIyBnZW5lcmF0ZSBpbXB1bHNlIHJlc3BvbnNlIGZ1bmN0aW9ucyB0byBkZXNjcmliZSByZXNwb25zZSBvZiBTdGVhcm5zIHRvIEhlbm5lcGluIGNoYW5nZXMKIyBodHRwczovL2tldmlua290emUuZ2l0aHViLmlvL3RzLTctdHV0LwojIGh0dHBzOi8vd3d3LnItZWNvbm9tZXRyaWNzLmNvbS90aW1lc2VyaWVzL3ZhcmludHJvLyAKaXJmLnN0ZWFybnNkIDwtIGlyZih2YXIuTU5fM2QsIG4uYWhlYWQgPSAxMiwgaW1wdWxzZSA9ICJIZW5uZXBpbiIsIHJlc3BvbnNlID0gIlN0ZWFybnMiLCBydW5zID0gNTAwKQpwbG90KGlyZi5zdGVhcm5zZCwgeWxhYiA9ICJTdGVhcm5zIENhc2VzIiwgbWFpbiA9ICJTaG9jayBmcm9tIEhlbm5lcGluIENhc2VzIikKaXJmLmhlbm5lcGluZCA8LSBpcmYodmFyLk1OXzNkLCBpbXB1bHNlID0gIlN0ZWFybnMiLCByZXNwb25zZSA9ICJIZW5uZXBpbiIsIG4uYWhlYWQgPSAxMiwgcnVucyA9IDUwMCkKcGxvdChpcmYuaGVubmVwaW5kLCB5bGFiID0gIkhlbm5lcGluIENhc2VzIiwgbWFpbiA9ICJTaG9jayBmcm9tIFN0ZWFybnMgQ2FzZXMiKQppcmYuaGVubjJkIDwtIGlyZih2YXIuTU5fM2QsIGltcHVsc2UgPSAiSGVubmVwaW4iLCByZXNwb25zZSA9ICJIZW5uZXBpbiIsIG4uYWhlYWQgPSAxMiwgcnVucyA9IDUwMCkKcGxvdChpcmYuaGVubjJkLCB5bGFiID0gIkhlbm5lcGluIENhc2VzIiwgbWFpbiA9ICJTaG9jayBmcm9tIEhlbm5lcGluIENhc2VzIikKTU5fM2QudmFyZGVjIDwtIGZldmQodmFyLk1OXzNkLCBuLmFoZWFkID0gMTIpICMgZm9yZWNhc3QgZXJyb3IgdmFyaWFuY2UgZGVjb21wb3NpdGlvbnMKcGxvdChNTl8zZC52YXJkZWMpICMgb3RoZXIgY291bnRpZXMgaGF2ZSBsZXNzIGluZmx1ZW5jZSBvbiBmb3JlY2FzdGluZyBkZWF0aHMgdGhhbiBjYXNlcwojIHZpZXcgZm9yZWNhc3RzIHVzaW5nIE1OXzNkIG1vZGVsCmZjYXN0TU5fM2QgPC0gcHJlZGljdCh2YXIuTU5fM2QsIG4uYWhlYWQgPSAxMikgIyBwcmVkaWN0IHRocm91Z2ggMDYuMjUuMjAKZmNhc3RNTl8zZCAjIGJldHRlciB0aGFuIGZ1bGwgbW9kZWwKcGxvdChmY2FzdE1OXzNkLCBuYW1lcyA9ICJTdGVhcm5zIikgCnBsb3QoZmNhc3RNTl8zZCwgbmFtZXMgPSAiSGVubmVwaW4iKQpwbG90KGZjYXN0TU5fM2QsIG5hbWVzID0gIkthbmRpeW9oaSIpCmZhbmNoYXJ0KGZjYXN0TU5fM2QpCiMgcHVsbCBvdXQganVzdCB0aGUgSGVubmVwaW4gY291bnR5IGZjYXN0cwpIZW5uZXBpbjNkIDwtIGZjYXN0TU5fM2QkZmNzdFsxXTsgSGVubmVwaW4KSGVubmVwaW4zZCA8LSBIZW5uZXBpbjNkJEhlbm5lcGluWywgMV07IEhlbm5lcGluCiMgSW52ZXJ0IHRoZSBkaWZmZXJlbmNpbmcgKGFkZCB0aGUgbGFzdCB2YWx1ZSBvZiB0aGUgdHMgZGF0YSB0byB0aGUgZm9yZWNhc3RzKQp0YWlsKE1OXzlkKSAjIGNhc2VzIGFkZGVkIGVhY2ggZGF5IC0gdXNlIHRoaXMgIyBiL2Mgd2UgZGlmZmVyZW5jZWQgdGhpcyBkYXRhCnRhaWwoTU5fOWRjdW0pICMgdG90YWwgY2FzZXMKSGVubmVwaW4zZCA8LSBIZW5uZXBpbjNkICsgNApIZW5uZXBpbjNkICMgdGhlc2UgdmFsdWVzIHNlZW0gbW9yZSByZWFsaXN0aWMKcGFyKG1mcm93ID0gYygxLCAxKSkKcGxvdC50cyhIZW5uZXBpbjNkKQojIGFkZCBkYXRhIGFuZCBmb3JlY2FzdCB0byBvbmUgdGltZSBzZXJpZXMKSGVubjNkX2Z1bGwgPC0gdHMoYyhNTl8zZFssIDFdLCBIZW5uZXBpbjNkKSwgc3RhcnQgPSBjKDIwMjAsIDU4KSwgZnJlcXVlbmN5ID0gMzY1KQpwbG90KEhlbm4zZF9mdWxsKQojIG1vZGVsIGxvb2tzIHNvbWV3aGF0IGJldHRlcgojIHZpZXcgS2FuZGl5b2hpIGFuZCBTdGVhcm5zIGRhdGEKS2FuZGkzZCA8LSBmY2FzdE1OXzNkJGZjc3RbMl0KS2FuZGkzZCA8LSBLYW5kaTNkJEthbmRpeW9oaVssIDFdCkthbmRpM2QgPC0gS2FuZGkzZCArIDAKS2FuZGkzZCAjIHNvbWUgbmVnYXRpdmUgdmFsdWVzIChjYXNlcyBjYW5ub3QgYmUgYmVsb3cgMCksIHZhbHVlcyB0b28gc21hbGwKS2FuZGkzZF9mdWxsIDwtIHRzKGMoTU5fM2RbLCAyXSwgS2FuZGkzZCksIHN0YXJ0ID0gYygyMDIwLCA1OCksIGZyZXF1ZW5jeSA9IDM2NSkKcGxvdChLYW5kaTNkX2Z1bGwpClN0ZWFybnMzZCA8LSBmY2FzdE1OXzNkJGZjc3RbM10KU3RlYXJuczNkIDwtIFN0ZWFybnMzZCRTdGVhcm5zWywgMV0KU3RlYXJuczNkIDwtIFN0ZWFybnMzZCArIDEKU3RlYXJuczNkClN0ZWFybnMzZF9mdWxsIDwtIHRzKGMoTU5fM2RbLCAzXSwgU3RlYXJuczNkKSwgc3RhcnQgPSBjKDIwMjAsIDU4KSwgZnJlcXVlbmN5ID0gMzY1KQpwbG90KFN0ZWFybnMzZF9mdWxsKSAjIHZhbHVlcyB0b28gc21hbGwgdG8gcHJlZGljdCB3ZWxsCgojIHJlcGVhdCBNTmNvdW50aWVzX1ZBUiBzdGVwcyBmb3IgY2hvc2VuIFVTc3RhdGVzCiMgdXNlIHJlY2VudCBkYXRhIGZyb20gdXNhZmFjdHMgYW5kIGxpbWl0IHRvIGNhc2VzIGJ1dCBpbmNsdWRlIG11bHRpcGxlIGNvdW50aWVzCnN0cihVU183Y3VtKQpVU183Y3VtIDwtIGFzLmRhdGEuZnJhbWUodChVU183Y3VtKSkKVVNfN2N1bSA8LSBVU183Y3VtWzI6MTQ1LCBdCmNvbG5hbWVzKFVTXzdjdW0pIDwtIGMoIkNPIiwgIk1JIiwgIk1OIiwgIk5FIiwgIlBBIiwgIlNEIiwgIlRYIikKZGltKFVTXzdjdW0pCnN0cihVU183Y3VtKQp0YWlsKFVTXzdjdW0pClVTXzdjdW0gPC0gVVNfN2N1bSAlPiUgbXV0YXRlX2lmKGlzLmZhY3RvciwgYXMuY2hhcmFjdGVyKQpVU183Y3VtIDwtIFVTXzdjdW0gJT4lIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLmludGVnZXIpCiMgdHJ1bmNhdGUgdG8gcmVtb3ZlIGRheXMgcHJpb3IgdG8gcmVwb3J0aW5nIChmaXJzdCBjYXNlIG9jY3VycyBvbiByb3cgNDUpClVTXzdjdW0gPC0gVVNfN2N1bVs0NDoxNDQsIF0KVVNfN2N1bQojIFNLSVAgVEhJUyBTVEVQIFRPIFNFRSBJRiBNT0RFTCBXT1JLUyBXSVRIIENVTSBEQVRBCiMgYWRkIGNvbCB0aGF0IHNob3dzIGRpZmZlcmVuY2UgYmV0d2VlbiB2YWx1ZXMgKFVTQWZhY3RzIGRhdGEgaXMgY3VtdWxhdGl2ZSkKVVNfNyA8LSBVU183Y3VtCnN0YXJ0ID0gMApVU183JENPIDwtIGMoc3RhcnQsIGRpZmYoVVNfNyRDTykpClVTXzckTUkgPC0gYyhzdGFydCwgZGlmZihVU183JE1JKSkKVVNfNyRNTiA8LSBjKHN0YXJ0LCBkaWZmKFVTXzckTU4pKQpVU183JE5FIDwtIGMoc3RhcnQsIGRpZmYoVVNfNyRORSkpClVTXzckUEEgPC0gYyhzdGFydCwgZGlmZihVU183JFBBKSkKVVNfNyRTRCA8LSBjKHN0YXJ0LCBkaWZmKFVTXzckU0QpKQpVU183JFRYIDwtIGMoc3RhcnQsIGRpZmYoVVNfNyRUWCkpCmhlYWQoVVNfNywgMTApCiMgY29udmVydCB0byB0cwpVU183dHMgPC0gdHMoVVNfNywgc3RhcnQgPSBjKDIwMjAsIDQ0KSwgZnJlcXVlbmN5ID0gMzY1KQpzdHIoVVNfN3RzKQphdXRvcGxvdChVU183dHMsIG1haW4gPSAiVGltZSBzZXJpZXMgcGxvdCBvZiB0aGUgVVNfNyBkYXRhIikKIyBkZXRlcm1pbmUgayBmb3IgYWRmLnRlc3QKdHJ1bmMoKGxlbmd0aChVU183KS0xKV4oMS8zKSkKIyBwZXJmb3JtIGFkZi50ZXN0IHRvIGNoZWNrIGZvciBzdGF0aW9uYXJpdHkgKEgwID0gbm9uLXN0YXRpb25hcnkpCmFwcGx5KFVTXzd0cywgMSwgYWRmLnRlc3QpICMgdHMgaXMgbm90IHN0YXRpb25hcnkKIyBkaWZmZXJlbmNlIHRoZSBlbnRpcmUgbXVsdGl2YXJpYXRlIHRzClVTXzdkaWZmIDwtIGRpZmZNKFVTXzcpClVTXzdbNDU6NTUsIF0KVVNfN2RpZmZbNDU6NTUsIF0KYXBwbHkoVVNfN2RpZmYsIDIsIGFkZi50ZXN0KSAjIG5vdyBzdGF0aW9uYXJ5IChwIHZhbHVlIDwgMC4wNSkKVVNfN3RzZGlmZiA8LSB0cyhVU183ZGlmZikKYXV0b3Bsb3QoVVNfN3RzZGlmZiwgbWFpbiA9ICJUaW1lIHNlcmllcyBwbG90IG9mIHRoZSBzdGF0aW9uYXJ5IChkaWZmZXJlbmNlZCkgVVNfN3RzIGRhdGEiKQojIGxhZyBvcmRlciBpZGVudGlmaWNhdGlvbgpWQVJzZWxlY3QoVVNfN3RzZGlmZiwgdHlwZSA9ICJub25lIiwgbGFnLm1heCA9IDE1KSAjIDEzIGlzIGJlc3QgbGFnIGZvciBtb3N0IHNlbGVjdGlvbiBjcml0ZXJpYQojIGNyZWF0ZSB0aGUgVkFSIG1vZGVsCnZhci5VU183IDwtIFZBUihVU183dHNkaWZmLCB0eXBlID0gIm5vbmUiLCBsYWcubWF4ID0gMTAsIGljID0gIkFJQyIpICMgZXJyb3JzIGFib3ZlIDEwIGR1ZSB0byBzbWFsbCBzaXplIG9mIHRzCnN1bW1hcnkodmFyLlVTXzcpICMgcmVsYXRpdmVseSBnb29kIG1vZGVsIHdpdGggbG93IHAtdmFsdWVzIGFuZCBoaWdoIGFkaiByLXNxdWFyZWQKIyBkaWFnbm9zdGljIHRlc3RzID0gUG9ydG1hbnRlYXUgVGVzdApzZXJpYWwudGVzdCh2YXIuVVNfNykgIyBwLXZhbHVlIGJlbG93IDAuMDUgaW5kaWNhdGVzIHdlIGhhdmUgYXV0b2NvcnJlbGF0aW9uIGluIGVycm9ycwojIEdyYW5nZXIgdGVzdCBmb3IgY2F1c2FsaXR5IChhbGwgc2hvdyBjYXVzYWxpdHkpCmNhdXNhbGl0eSh2YXIuVVNfNywgY2F1c2UgPSBjKCJDTyIpKSAjIHRoZXJlIGlzIGNhdXNhbGl0eSAobG93IHAtdmFsdWVzIGZvciBib3RoIEdyYW5nZXIgYW5kIEluc3RhbnQpCmNhdXNhbGl0eSh2YXIuVVNfNywgY2F1c2UgPSBjKCJNSSIpKSAjIHRoZXJlIGlzIGNhdXNhbGl0eSAobG93IHAtdmFsdWVzIGZvciBib3RoIEdyYW5nZXIgYW5kIEluc3RhbnQpCmNhdXNhbGl0eSh2YXIuVVNfNywgY2F1c2UgPSBjKCJNTiIpKSAjIHRoZXJlIGlzIGNhdXNhbGl0eSAobG93IHAtdmFsdWVzIGZvciBib3RoIEdyYW5nZXIgYW5kIEluc3RhbnQpCmNhdXNhbGl0eSh2YXIuVVNfNywgY2F1c2UgPSBjKCJORSIpKSAjIGNhdXNhbGl0eQpjYXVzYWxpdHkodmFyLlVTXzcsIGNhdXNlID0gYygiUEEiKSkgIyBjYXVzYWxpdHkKY2F1c2FsaXR5KHZhci5VU183LCBjYXVzZSA9IGMoIlNEIikpICMgY2F1c2FsaXR5CmNhdXNhbGl0eSh2YXIuVVNfNywgY2F1c2UgPSBjKCJUWCIpKSAjIGNhdXNhbGl0eQojIG90aGVyIGRpYWdub3N0aWMgdGVzdHMKYXJjaC50ZXN0KHZhci5VU183KSAjIHRlc3QgZm9yIGF1dG9yZWdyZXNzaXZlIGNvbmRpdGlvbmFsIGhldGVyb3NjZWRhc3RpY2l0eSAoQVJDSCksIHAtdmFsdWUgPSAxCm5vcm1hbGl0eS50ZXN0KHZhci5VU183KSAjIHAtdmFsdWUgYmVsb3cgMC4wNQojIGZvcmVjYXN0CmZjYXN0VVNfNyA8LSBwcmVkaWN0KHZhci5VU183LCBuLmFoZWFkID0gMTIpICMgcHJlZGljdCB0aHJvdWdoIDA2LjI1LjIwCmZjYXN0VVNfNyAjIHZhbHVlcyBzZWVtIHRvIGJlIHZvbGF0aWxlIGNvbnNpZGVyaW5nIHNvbWUgY291bnRpZXMgaGF2ZSBzbWFsbCAjJ3Mgb2YgY2FzZXMgYXQgdGFpbCBvZiBkYXRhCnBsb3QoZmNhc3RVU183KQpmYW5jaGFydChmY2FzdFVTXzcpCiMgcHVsbCBvdXQganVzdCB0aGUgQ08gZmNhc3RzCkNPIDwtIGZjYXN0VVNfNyRmY3N0WzFdOyBDTwpDTyA8LSBDTyRDT1ssIDFdOyBDTwojIEludmVydCB0aGUgZGlmZmVyZW5jaW5nIChhZGQgdGhlIGxhc3QgdmFsdWUgb2YgdGhlIHRzIGRhdGEgdG8gdGhlIGZvcmVjYXN0cykKdGFpbChVU183KSAjIGNhc2VzIGFkZGVkIGVhY2ggZGF5IC0gdXNlIHRoaXMgIyBiL2Mgd2UgZGlmZmVyZW5jZWQgdGhpcyBkYXRhCnRhaWwoVVNfN2N1bSkgIyB0b3RhbCBjYXNlcwpDTyA8LSBDTyArIDE5NgpDTyAjIG1hbnkgb2YgdGhlc2UgYXJlIGltcG9zc2libGUgIydzIGJlY2F1c2UgbG93ZXN0IHBvc3NpYmxlIGlzIDAKcGFyKG1mcm93ID0gYygxLCAxKSkKcGxvdC50cyhDTykKIyBhZGQgZGF0YSBhbmQgZm9yZWNhc3QgdG8gb25lIHRpbWUgc2VyaWVzCkNPX2Z1bGwgPC0gdHMoYyhVU183WywgMV0sIENPKSwgc3RhcnQgPSBjKDIwMjAsIDQ0KSwgZnJlcXVlbmN5ID0gMzY1KQpwbG90KENPX2Z1bGwpCiMgbm90IGEgZ29vZCBtb2RlbCBhdCBhbGwhIAojVHJ5IGZld2VyIHN0YXRlcz8gMyBjb3VudGllcyB3ZXJlIHN1Y2Nlc3NmdWwsIHNvIG5hcnJvdyBkb3duIHRvIDMgc3RhdGVzCiMgdXNlIENPLCBNTiwgYW5kIFRYIChteSBoeXBvdGhlc2lzIGlzIHRoYXQgQ08gaXMgbGFnZ2luZyBpbmRpY2F0b3IgZm9yIE1OIGFuZCBUWCkKVVNfMyA8LSBVU183WywgYygxLCAzLCA3KV0KVVNfM2RpZmYgPC0gZGlmZk0oVVNfMykKVVNfM3RzZGlmZiA8LSB0cyhVU18zZGlmZiwgc3RhcnQgPSBjKDIwMjAsIDQ1KSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdChVU18zdHNkaWZmLCBtYWluID0gIlRpbWUgc2VyaWVzIHBsb3Qgb2YgdGhlIHN0YXRpb25hcnkgKGRpZmZlcmVuY2VkKSBVU18zIGRhdGEiKQojIGJ1aWxkIG1vZGVsClZBUnNlbGVjdChVU18zdHNkaWZmLCB0eXBlID0gIm5vbmUiKSAjIHRyeSA1LCAyLCAxLCAzCnZhci5VU18zIDwtIFZBUihVU18zdHNkaWZmLCB0eXBlID0gIm5vbmUiLCBwID0gNSkKc2VyaWFsLnRlc3QodmFyLlVTXzMpICMgcC12YWx1ZSBoaWdoIGVub3VnaCEgTm90IGF1dG9jb3JyZWxhdGVkCiMgZ2VuZXJhdGUgaW1wdWxzZSByZXNwb25zZSBmdW5jdGlvbnMgdG8gZGVzY3JpYmUgcmVzcG9uc2Ugb2YgTU4gdG8gVFggY2hhbmdlcwojIGh0dHBzOi8va2V2aW5rb3R6ZS5naXRodWIuaW8vdHMtNy10dXQvCiMgaHR0cHM6Ly93d3cuci1lY29ub21ldHJpY3MuY29tL3RpbWVzZXJpZXMvdmFyaW50cm8vIAppcmYuTU4gPC0gaXJmKHZhci5VU18zLCBuLmFoZWFkID0gMTIsIGltcHVsc2UgPSAiVFgiLCByZXNwb25zZSA9ICJNTiIsIHJ1bnMgPSA1MDApCnBsb3QoaXJmLk1OLCB5bGFiID0gIk1OIENhc2VzIiwgbWFpbiA9ICJTaG9jayBmcm9tIFRYIENhc2VzIikKaXJmLlRYIDwtIGlyZih2YXIuVVNfMywgaW1wdWxzZSA9ICJNTiIsIHJlc3BvbnNlID0gIlRYIiwgbi5haGVhZCA9IDEyLCBydW5zID0gNTAwKQpwbG90KGlyZi5UWCwgeWxhYiA9ICJUWCBDYXNlcyIsIG1haW4gPSAiU2hvY2sgZnJvbSBNTiBDYXNlcyIpClVTXzMudmFyZGVjIDwtIGZldmQodmFyLlVTXzMsIG4uYWhlYWQgPSAxMikgIyBmb3JlY2FzdCBlcnJvciB2YXJpYW5jZSBkZWNvbXBvc2l0aW9ucwpwbG90KFVTXzMudmFyZGVjKQojIHZpZXcgZm9yZWNhc3RzIHVzaW5nIFVTXzMgbW9kZWwgVkFSKDkpCmZjYXN0VVNfMyA8LSBwcmVkaWN0KHZhci5VU18zLCBuLmFoZWFkID0gMTIpICMgcHJlZGljdCB0aHJvdWdoIDA2LjI1LjIwCmZjYXN0VVNfMyAjIGJldHRlciB0aGFuIGZ1bGwgbW9kZWwKcGxvdChmY2FzdFVTXzMsIG5hbWVzID0gIkNPIikKcGxvdChmY2FzdFVTXzMsIG5hbWVzID0gIk1OIikKcGxvdChmY2FzdFVTXzMsIG5hbWVzID0gIlRYIikKZmFuY2hhcnQoZmNhc3RVU18zKQojIHB1bGwgb3V0IGp1c3QgdGhlIENPIGZjYXN0cwpDTzMgPC0gZmNhc3RVU18zJGZjc3RbMV07IENPMwpDTzMgPC0gQ08zJENPWywgMV07IENPMwojIEludmVydCB0aGUgZGlmZmVyZW5jaW5nIChhZGQgdGhlIGxhc3QgdmFsdWUgb2YgdGhlIHRzIGRhdGEgdG8gdGhlIGZvcmVjYXN0cykKdGFpbChVU18zKSAjIGNhc2VzIGFkZGVkIGVhY2ggZGF5IC0gdXNlIHRoaXMgIyBiL2Mgd2UgZGlmZmVyZW5jZWQgdGhpcyBkYXRhCkNPMyA8LSBDTzMgKyAxOTYKQ08zICMgdGhlc2UgdmFsdWVzIHNlZW0gbW9yZSByZWFsaXN0aWMgKGV4Y2VwdCBmb3IgdGhlIGZpcnN0IG5lZ2F0aXZlKQpwYXIobWZyb3cgPSBjKDEsIDEpKQpwbG90LnRzKENPMykKIyBhZGQgZGF0YSBhbmQgZm9yZWNhc3QgdG8gb25lIHRpbWUgc2VyaWVzCkNPM19mdWxsIDwtIHRzKGMoVVNfM1ssIDFdLCBDTzMpLCBzdGFydCA9IGMoMjAyMCwgNDQpLCBmcmVxdWVuY3kgPSAzNjUpCnBsb3QoQ08zX2Z1bGwpCiMgbW9kZWwgbG9va3Mgc29tZXdoYXQgYmV0dGVyCiMgdmlldyBNTiBhbmQgVFggZGF0YQpNTjMgPC0gZmNhc3RVU18zJGZjc3RbMl0KTU4zIDwtIE1OMyRNTlssIDFdCk1OMyA8LSBNTjMgKyAzNzcKTU4zCk1OM19mdWxsIDwtIHRzKGMoVVNfM1ssIDJdLCBNTjMpLCBzdGFydCA9IGMoMjAyMCwgNDQpLCBmcmVxdWVuY3kgPSAzNjUpCnBsb3QoTU4zX2Z1bGwpClRYMyA8LSBmY2FzdFVTXzMkZmNzdFszXQpUWDMgPC0gVFgzJFRYWywgMV0KVFgzIDwtIFRYMyArIDIzNDAKVFgzICMgbG9va3MgZ29vZApUWDNfZnVsbCA8LSB0cyhjKFVTXzNbLCAzXSwgVFgzKSwgc3RhcnQgPSBjKDIwMjAsIDQ0KSwgZnJlcXVlbmN5ID0gMzY1KQpwbG90KFRYM19mdWxsKQojIHVzZSByZWNlbnQgZGF0YSBmcm9tIHVzYWZhY3RzIGFuZCBsaW1pdCB0byBkZWF0aHMgYnV0IGluY2x1ZGUgbXVsdGlwbGUgY291bnRpZXMKVVNfN2RjdW0gPC0gYXMuZGF0YS5mcmFtZSh0KFVTXzdkY3VtKSkKc3RyKFVTXzdkY3VtKQpVU183ZGN1bSA8LSBVU183ZGN1bVsyOjE0NSwgXQpjb2xuYW1lcyhVU183ZGN1bSkgPC0gYygiQ08iLCAiTUkiLCAiTU4iLCAiTkUiLCAiUEEiLCAiU0QiLCAiVFgiKQpkaW0oVVNfN2RjdW0pCnN0cihVU183ZGN1bSkKdGFpbChVU183ZGN1bSkKVVNfN2RjdW0gPC0gVVNfN2RjdW0gJT4lIG11dGF0ZV9pZihpcy5mYWN0b3IsIGFzLmNoYXJhY3RlcikKVVNfN2RjdW0gPC0gVVNfN2RjdW0gJT4lIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLmludGVnZXIpCmhlYWQoVVNfN2RjdW0sIDYwKQojIHRydW5jYXRlIHRvIHJlbW92ZSBkYXlzIHByaW9yIHRvIHJlcG9ydGluZyAoZmlyc3QgZGVhdGggb2NjdXJzIG9uIHJvdyA0OSkKVVNfN2RjdW0gPC0gVVNfN2RjdW1bNDg6MTQ0LCBdCmhlYWQoVVNfN2RjdW0sIDE1KQojIGFkZCBjb2wgdGhhdCBzaG93cyBkaWZmZXJlbmNlIGJldHdlZW4gdmFsdWVzIChVU0FmYWN0cyBkYXRhIGlzIGN1bXVsYXRpdmUpClVTXzdkIDwtIFVTXzdkY3VtCnN0YXJ0ID0gMApVU183ZCRDTyA8LSBjKHN0YXJ0LCBkaWZmKFVTXzdkJENPKSkKVVNfN2QkTUkgPC0gYyhzdGFydCwgZGlmZihVU183ZCRNSSkpClVTXzdkJE1OIDwtIGMoc3RhcnQsIGRpZmYoVVNfN2QkTU4pKQpVU183ZCRORSA8LSBjKHN0YXJ0LCBkaWZmKFVTXzdkJE5FKSkKVVNfN2QkUEEgPC0gYyhzdGFydCwgZGlmZihVU183ZCRQQSkpClVTXzdkJFNEIDwtIGMoc3RhcnQsIGRpZmYoVVNfN2QkU0QpKQpVU183ZCRUWCA8LSBjKHN0YXJ0LCBkaWZmKFVTXzdkJFRYKSkKaGVhZChVU183ZCwgMTApCiMgY29udmVydCB0byB0cwpVU183ZHRzIDwtIHRzKFVTXzdkLCBzdGFydCA9IGMoMjAyMCwgNDgpLCBmcmVxdWVuY3kgPSAzNjUpCnN0cihVU183ZHRzKQphdXRvcGxvdChVU183ZHRzLCBtYWluID0gIlRpbWUgc2VyaWVzIHBsb3Qgb2YgdGhlIFVTXzdkIGRhdGEiKQojIGRldGVybWluZSBrIGZvciBhZGYudGVzdAp0cnVuYygobGVuZ3RoKFVTXzdkKS0xKV4oMS8zKSkKIyBwZXJmb3JtIGFkZi50ZXN0IHRvIGNoZWNrIGZvciBzdGF0aW9uYXJpdHkgKEgwID0gbm9uLXN0YXRpb25hcnkpCmFwcGx5KFVTXzdkdHMsIDEsIGFkZi50ZXN0KSAjIGVudGlyZSB0cyBpcyBub3Qgc3RhdGlvbmFyeSB5ZXQKIyBkaWZmZXJlbmNlIHRoZSBlbnRpcmUgbXVsdGl2YXJpYXRlIHRzClVTXzdkdHNkaWZmIDwtIGRpZmZNKFVTXzdkKQpVU183ZFs0NTo1NSwgXQpVU183ZHRzZGlmZls0NTo1NSwgXQphcHBseShVU183ZHRzZGlmZiwgMiwgYWRmLnRlc3QpICMgbm93IHN0YXRpb25hcnkgKHAgdmFsdWUgPCAwLjA1KQpVU183ZHRzZGlmZiA8LSB0cyhVU183ZHRzZGlmZikKYXV0b3Bsb3QoVVNfN2R0c2RpZmYsIG1haW4gPSAiVGltZSBzZXJpZXMgcGxvdCBvZiB0aGUgc3RhdGlvbmFyeSAoZGlmZmVyZW5jZWQpIE1OXzl0cyBkYXRhIikKIyBsYWcgb3JkZXIgaWRlbnRpZmljYXRpb24KVkFSc2VsZWN0KFVTXzdkdHNkaWZmLCB0eXBlID0gIm5vbmUiLCBsYWcubWF4ID0gMTUpICMgMTIgaXMgYmVzdCBsYWcgZm9yIGFsbCBzZWxlY3Rpb24gY3JpdGVyaWEKIyBjcmVhdGUgdGhlIFZBUiBtb2RlbAp2YXIuVVNfN2QgPC0gVkFSKFVTXzdkdHNkaWZmLCB0eXBlID0gIm5vbmUiLCBsYWcubWF4ID0gMTAsIGljID0gIkFJQyIpICMgZXJyb3JzIGFib3ZlIDEwIGR1ZSB0byBzbWFsbCBzaXplIG9mIHRzCnN1bW1hcnkodmFyLlVTXzdkKSAjIHJlbGF0aXZlbHkgZ29vZCBtb2RlbCB3aXRoIGxvdyBwLXZhbHVlcyBhbmQgaGlnaCBhZGogci1zcXVhcmVkCiMgZGlhZ25vc3RpYyB0ZXN0cyA9IFBvcnRtYW50ZWF1IFRlc3QKc2VyaWFsLnRlc3QodmFyLlVTXzdkKSAjIHAtdmFsdWUgYmVsb3cgMC4wNSBpbmRpY2F0ZXMgd2UgaGF2ZSBhdXRvY29ycmVsYXRpb24gaW4gZXJyb3JzCiMgR3JhbmdlciB0ZXN0IGZvciBjYXVzYWxpdHkgKGFsbCBzaG93IGNhdXNhbGl0eSkKY2F1c2FsaXR5KHZhci5VU183ZCwgY2F1c2UgPSBjKCJDTyIpKSAjIHRoZXJlIGlzIGNhdXNhbGl0eSAobG93IHAtdmFsdWVzIGZvciBib3RoIEdyYW5nZXIgYW5kIEluc3RhbnQpCmNhdXNhbGl0eSh2YXIuVVNfN2QsIGNhdXNlID0gYygiTUkiKSkgIyB0aGVyZSBpcyBjYXVzYWxpdHkgKGxvdyBwLXZhbHVlcyBmb3IgYm90aCBHcmFuZ2VyIGFuZCBJbnN0YW50KQpjYXVzYWxpdHkodmFyLlVTXzdkLCBjYXVzZSA9IGMoIk1OIikpICMgdGhlcmUgaXMgY2F1c2FsaXR5IChsb3cgcC12YWx1ZXMgZm9yIGJvdGggR3JhbmdlciBhbmQgSW5zdGFudCkKY2F1c2FsaXR5KHZhci5VU183ZCwgY2F1c2UgPSBjKCJORSIpKSAjIGNhdXNhbGl0eSwgc2lnbmlmaWNhbnQKY2F1c2FsaXR5KHZhci5VU183ZCwgY2F1c2UgPSBjKCJQQSIpKSAjIGNhdXNhbGl0eQpjYXVzYWxpdHkodmFyLlVTXzdkLCBjYXVzZSA9IGMoIlNEIikpICMgY2F1c2FsaXR5CmNhdXNhbGl0eSh2YXIuVVNfN2QsIGNhdXNlID0gYygiVFgiKSkgIyBjYXVzYWxpdHkKIyBvdGhlciBkaWFnbm9zdGljIHRlc3RzCmFyY2gudGVzdCh2YXIuVVNfN2QpICMgdGVzdCBmb3IgYXV0b3JlZ3Jlc3NpdmUgY29uZGl0aW9uYWwgaGV0ZXJvc2NlZGFzdGljaXR5IChBUkNIKSwgcC12YWx1ZSA9IDEKbm9ybWFsaXR5LnRlc3QodmFyLlVTXzdkKSAjIHAtdmFsdWUgYmVsb3cgMC4wNQojIHVzZSBvcmlnaW5hbCBtb2RlbCB0byBmb3JlY2FzdCBkZWF0aHMKZmNhc3RVU183ZCA8LSBwcmVkaWN0KHZhci5VU183ZCwgbi5haGVhZCA9IDEyKSAjIHByZWRpY3QgdGhyb3VnaCAwNi4yNS4yMApmY2FzdFVTXzdkCnBhcihtYXIgPSBjKDAuNSwgMC41LCAwLjUsIDAuNSkpCnBsb3QoZmNhc3RVU183ZCkgIyBmb3JlY2FzdHMgYXJlIG11Y2ggdG9vIHZhcmllZCBjb21wYXJlZCB0byBkaWZmZXJlbmNlZCBkYXRhIChzYW1lIHByb2JsZW0gYXMgY2FzZXMgVkFSIG1vZGVsKQojIHB1bGwgb3V0IGp1c3QgdGhlIENPIGZjYXN0cwpDT2QgPC0gZmNhc3RVU183ZCRmY3N0WzFdOyBDT2QKQ09kIDwtIENPZCRDT1ssIDFdOyBDT2QKIyBJbnZlcnQgdGhlIGRpZmZlcmVuY2luZyAoYWRkIHRoZSBsYXN0IHZhbHVlIG9mIHRoZSB0cyBkYXRhIHRvIHRoZSBmb3JlY2FzdHMpCnRhaWwoVVNfN2QpICMgZGVhdGhzIGFkZGVkIGVhY2ggZGF5IC0gdXNlIHRoaXMgIyBiL2Mgd2UgZGlmZmVyZW5jZWQgdGhpcyBkYXRhCnRhaWwoVVNfN2RjdW0pICMgdG90YWwgZGVhdGhzCkNPZCA8LSBDT2QgKyAzCkNPZCAjIG1hbnkgb2YgdGhlc2UgYXJlIGltcG9zc2libGUgIydzIGJlY2F1c2UgbG93ZXN0IHBvc3NpYmxlIGlzIDAKcGFyKG1mcm93ID0gYygxLCAxKSkKcGxvdC50cyhDT2QpCiMgYWRkIGRhdGEgYW5kIGZvcmVjYXN0IHRvIG9uZSB0aW1lIHNlcmllcwpDT19mdWxsZCA8LSB0cyhjKFVTXzdkWywgMV0sIENPZCksIHN0YXJ0ID0gYygyMDIwLCA0OCksIGZyZXF1ZW5jeSA9IDM2NSkKcGxvdChDT19mdWxsZCkgIyBmYXIgdG9vIHZvbGF0aWxlCiMgbm90IGEgZ29vZCBtb2RlbCBhdCBhbGwhIAojVHJ5IDMgc3RhdGVzCiMgdXNlIENPLCBNTiwgYW5kIFRYIChteSBoeXBvdGhlc2lzIGlzIHRoYXQgQ08gaXMgbGFnZ2luZyBpbmRpY2F0b3IgZm9yIE1OIGFuZCBUWCkKVVNfM2QgPC0gVVNfN2RbLCBjKDEsIDMsIDcpXQpVU18zZGRpZmYgPC0gZGlmZk0oVVNfM2QpClVTXzNkdHNkaWZmIDwtIHRzKFVTXzNkZGlmZiwgc3RhcnQgPSBjKDIwMjAsIDQ4KSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdChVU18zZHRzZGlmZiwgbWFpbiA9ICJUaW1lIHNlcmllcyBwbG90IG9mIHRoZSBzdGF0aW9uYXJ5IChkaWZmZXJlbmNlZCkgVVNfM2QgZGF0YSIpCiMgYnVpbGQgbW9kZWwKVkFSc2VsZWN0KFVTXzNkdHNkaWZmLCB0eXBlID0gIm5vbmUiKSAjIDEwLCAyCnZhci5VU18zZCA8LSBWQVIoVVNfM2R0c2RpZmYsIHR5cGUgPSAibm9uZSIsIGljID0gIkFJQyIpCnNlcmlhbC50ZXN0KHZhci5VU18zZCkgIyBwLXZhbHVlIHRvbyBsb3cgKGJ1dCBiZXR0ZXIgdGhhbiBjYXNlcyBtb2RlbCkKIyBnZW5lcmF0ZSBpbXB1bHNlIHJlc3BvbnNlIGZ1bmN0aW9ucyB0byBkZXNjcmliZSByZXNwb25zZSBvZiBTdGVhcm5zIHRvIEhlbm5lcGluIGNoYW5nZXMKIyBodHRwczovL2tldmlua290emUuZ2l0aHViLmlvL3RzLTctdHV0LwojIGh0dHBzOi8vd3d3LnItZWNvbm9tZXRyaWNzLmNvbS90aW1lc2VyaWVzL3ZhcmludHJvLyAKaXJmLkNPZCA8LSBpcmYodmFyLlVTXzNkLCBuLmFoZWFkID0gMTIsIGltcHVsc2UgPSAiQ08iLCByZXNwb25zZSA9ICJNTiIsIHJ1bnMgPSA1MDApCnBsb3QoaXJmLkNPZCwgeWxhYiA9ICJNTiBDYXNlcyIsIG1haW4gPSAiU2hvY2sgZnJvbSBDTyBDYXNlcyIpCmlyZi5NTmQgPC0gaXJmKHZhci5VU18zZCwgaW1wdWxzZSA9ICJNTiIsIHJlc3BvbnNlID0gIkNPIiwgbi5haGVhZCA9IDEyLCBydW5zID0gNTAwKQpwbG90KGlyZi5NTmQsIHlsYWIgPSAiQ08gQ2FzZXMiLCBtYWluID0gIlNob2NrIGZyb20gTU4gQ2FzZXMiKQpVU18zZC52YXJkZWMgPC0gZmV2ZCh2YXIuVVNfM2QsIG4uYWhlYWQgPSAxMikgIyBmb3JlY2FzdCBlcnJvciB2YXJpYW5jZSBkZWNvbXBvc2l0aW9ucwpwbG90KFVTXzNkLnZhcmRlYykgIyBUWCBpcyBpbmZsdWVuY2VkIGJ5IE1OIGFuZCBDTywgYnV0IG90aGVycyBhcmUgbm90IGluZmx1ZW5jZWQgYnkgYW55IG90aGVyIHN0YXRlCiMgdmlldyBmb3JlY2FzdHMgdXNpbmcgVVNfM2QgbW9kZWwKZmNhc3RVU18zZCA8LSBwcmVkaWN0KHZhci5VU18zZCwgbi5haGVhZCA9IDEyKSAjIHByZWRpY3QgdGhyb3VnaCAwNi4yNS4yMApmY2FzdFVTXzNkICMgYmV0dGVyIHRoYW4gZnVsbCBtb2RlbApwbG90KGZjYXN0VVNfM2QsIG5hbWVzID0gIkNPIikgCnBsb3QoZmNhc3RVU18zZCwgbmFtZXMgPSAiTU4iKQpwbG90KGZjYXN0VVNfM2QsIG5hbWVzID0gIlRYIikKZmFuY2hhcnQoZmNhc3RVU18zZCkKIyBwdWxsIG91dCBqdXN0IHRoZSBIZW5uZXBpbiBjb3VudHkgZmNhc3RzCkNPM2QgPC0gZmNhc3RVU18zZCRmY3N0WzFdOyBDTzNkCkNPM2QgPC0gQ08zZCRDT1ssIDFdOyBDTzNkCiMgSW52ZXJ0IHRoZSBkaWZmZXJlbmNpbmcgKGFkZCB0aGUgbGFzdCB2YWx1ZSBvZiB0aGUgdHMgZGF0YSB0byB0aGUgZm9yZWNhc3RzKQp0YWlsKFVTXzdkKSAjIGNhc2VzIGFkZGVkIGVhY2ggZGF5IC0gdXNlIHRoaXMgIyBiL2Mgd2UgZGlmZmVyZW5jZWQgdGhpcyBkYXRhCnRhaWwoVVNfN2RjdW0pICMgdG90YWwgY2FzZXMKQ08zZCA8LSBDTzNkICsgMwpDTzNkICMgdGhlc2UgdmFsdWVzIHNlZW0gbW9yZSByZWFsaXN0aWMKcGFyKG1mcm93ID0gYygxLCAxKSkKcGxvdC50cyhDTzNkKQojIGFkZCBkYXRhIGFuZCBmb3JlY2FzdCB0byBvbmUgdGltZSBzZXJpZXMKQ08zZF9mdWxsIDwtIHRzKGMoVVNfM2RbLCAxXSwgQ08zZCksIHN0YXJ0ID0gYygyMDIwLCA0OCksIGZyZXF1ZW5jeSA9IDM2NSkKcGxvdChDTzNkX2Z1bGwpCiMgbW9kZWwgbG9va3MgbXVjaCBiZXR0ZXIKIyB2aWV3IE1OIGFuZCBUWCBkYXRhCk1OM2QgPC0gZmNhc3RVU18zZCRmY3N0WzJdCk1OM2QgPC0gTU4zZCRNTlssIDFdCk1OM2QgPC0gTU4zZCArIDkKTU4zZCAjIHNsb29rcyBnb29kCk1OM2RfZnVsbCA8LSB0cyhjKFVTXzNkWywgMl0sIE1OM2QpLCBzdGFydCA9IGMoMjAyMCwgNDgpLCBmcmVxdWVuY3kgPSAzNjUpCnBsb3QoTU4zZF9mdWxsKQpUWDNkIDwtIGZjYXN0VVNfM2QkZmNzdFszXQpUWDNkIDwtIFRYM2QkVFhbLCAxXQpUWDNkIDwtIFRYM2QgKyAxClRYM2QgIyBuZWdhdGl2ZSB2YWx1ZXM/IApUWDNkX2Z1bGwgPC0gdHMoYyhVU18zZFssIDNdLCBUWDNkKSwgc3RhcnQgPSBjKDIwMjAsIDQ4KSwgZnJlcXVlbmN5ID0gMzY1KQpwbG90KFRYM2RfZnVsbCkgIyB2YWx1ZXMgdG9vIHNtYWxsIHRvIHByZWRpY3Qgd2VsbAoKYGBgClZJSS4gRmluYWwgbW9kZWwgY2hlY2sKICBBLiBMb2FkIGN1cnJlbnQgZGF0YSB0aHJvdWdoIEp1bmUgMjR0aCAoQ09WSUQgY2FzZXMgYW5kIGRlYXRocykKICBCLiBDaGVjayBwcmVkaWN0aW9ucyBmcm9tIDMga2V5IGNvdW50eSBtb2RlbHMgYWdhaW5zdCBjdXJyZW50IGRhdGEgKEFSSU1BLCBWQVIsIFJlZ3Jlc3Npb24pCiAgQy4gQ2hlY2sgcHJlZGljdGlvbnMgZm9yIHN0YXRlIG9mIE1OIGFnYWluc3QgY3VycmVudCBkYXRhIChBUklNQSwgVkFSKQpgYGB7cn0KIyBBREQgTU9SRSBSRUNFTlQgREFUQSBUTyBVUywgTU4sIFNFTEVDVCBDT1VOVElFUyAoRlJPTSBVU0FGQUNUUykKIyBSRVJVTiBUUyBGT1JFQ0FTVFMgVVNJTkcgVVBEQVRFRCBEQVRBIEFORCBNRUFTVVJFIEFDQ1VSQUNZLCBQUkVESUNUIE5FWFQgMTAgREFZUwoKIyBkYXRhIHRocm91Z2ggMDYvMTIvMjAyMAojIGh0dHBzOi8vdXNhZmFjdHMub3JnL3Zpc3VhbGl6YXRpb25zL2Nvcm9uYXZpcnVzLWNvdmlkLTE5LXNwcmVhZC1tYXAvCgojIHN0ZXBzIHRvIGNvbWJpbmUgZGF0YQojIGZpbHRlciBjYXNlcyB0byBzaW5nbGUgY291bnR5Ck1OMDYxMmMgPC0gY2FzZXMwNjEyICU+JSBmaWx0ZXIoU3RhdGUgPT0gIk1OIikKSGVubmVwaW4wNjEyYyA8LSBNTjA2MTJjICU+JSBmaWx0ZXIoQ291bnR5Lk5hbWUgPT0gIkhlbm5lcGluIENvdW50eSIpCkhlbm5lcGluMDYxMmMgPC0gSGVubmVwaW4wNjEyY1ssIDU6MTQ4XQpkaW0oSGVubmVwaW4wNjEyYykKY2xhc3MoSGVubmVwaW4wNjEyYykKIyBpbnZlcnQgY29sdW1ucyBhbmQgcm93cwp4IDwtIGFzLmRhdGEuZnJhbWUodChIZW5uZXBpbjA2MTJjKSkKZGltKHgpCmNsYXNzKHgpCmNvbG5hbWVzKHgpIDwtICJWMSIKc3RyKHgpCnN0YXJ0IDwtIHhbMSwgMV0Kc3RhcnQKdGFpbCh4KQojIGFkZCBjb2wgdGhhdCBzaG93cyBkaWZmZXJlbmNlIGJldHdlZW4gdmFsdWVzIChVU0FmYWN0cyBkYXRhIGlzIGN1bXVsYXRpdmUpCngkZGlmZiA8LSBjKHN0YXJ0LCBkaWZmKHgkVjEpKQp4CmNvbG5hbWVzKHgpIDwtIGMoIkN1bSIsICJDYXNlcyIpCiMgcmVwZWF0IGZvciBkZWF0aHMKTU4wNjEyZCA8LSBkZWF0aHMwNjEyICU+JSBmaWx0ZXIoU3RhdGUgPT0gIk1OIikKSGVubmVwaW4wNjEyZCA8LSBNTjA2MTJkICU+JSBmaWx0ZXIoQ291bnR5Lk5hbWUgPT0gIkhlbm5lcGluIENvdW50eSIpCkhlbm5lcGluMDYxMmQgPC0gSGVubmVwaW4wNjEyZFssIDU6MTQ4XQpzdHIoSGVubmVwaW4wNjEyZCkKZGltKEhlbm5lcGluMDYxMmQpCiMgaW52ZXJ0IGNvbHVtbnMgYW5kIHJvd3MKeSA8LSBhcy5kYXRhLmZyYW1lKHQoSGVubmVwaW4wNjEyZCkpCmRpbSh5KQpjb2xuYW1lcyh5KSA8LSAiVjEiCnN0cih5KQpzdGFydCA8LSB5WzEsIDFdCnN0YXJ0CnRhaWwoeSkKIyBhZGQgY29sIHRoYXQgc2hvd3MgZGlmZmVyZW5jZSBiZXR3ZWVuIHZhbHVlcyAoVVNBZmFjdHMgZGF0YSBpcyBjdW11bGF0aXZlKQp5JGRpZmYgPC0gYyhzdGFydCwgZGlmZih5JFYxKSkKaGVhZCh5KQp0YWlsKHkpCmNvbG5hbWVzKHkpIDwtIGMoIkN1bSIsICJEZWF0aHMiKQojIGNvbWJpbmUgQ2FzZXMgYW5kIERlYXRocwpIZW5uTU4wNjEyIDwtIGNiaW5kKHgkQ2FzZXMsIHkkRGVhdGhzKQpjb2xuYW1lcyhIZW5uTU4wNjEyKSA8LSBjKCJDYXNlcyIsICJEZWF0aHMiKQpIZW5uTU4wNjEyCnN0cihIZW5uTU4wNjEyKQp0YWlsKEhlbm5NTjA2MTIpCkhlbm5NTnRzIDwtIHRzKEhlbm5NTjA2MTIsIHN0YXJ0ID0gYygyMDIwLCAyMiksIGZyZXF1ZW5jeSA9IDM2NSkKc3RyKEhlbm5NTnRzKQpoZWFkKEhlbm5NTnRzKQpIZW5uTU50cwphdXRvcGxvdChIZW5uTU50cywgbWFpbiA9ICJDT1ZJRC0xOSBDYXNlcyBhbmQgRGVhdGhzIC0gTWlubmVzb3RhIikKCgojIENSRUFURSBURVNUL1RSQUlOIFNFVFMgRk9SIENBU0VTIEFORCBERUFUSFMKYXV0b3Bsb3QoSGVubk1OdHMpCkhlbm5fY2FzZXMgPC0gSGVubk1OdHNbLCAiQ2FzZXMiXQpIZW5uX2Nhc2VzX3RyYWluIDwtIEhlbm5fY2FzZXMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyNCkpCkhlbm5fY2FzZXNfdGVzdCA8LSBIZW5uX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxNDQpKQpIZW5uX2RlYXRocyA8LSBIZW5uTU50c1ssICJEZWF0aHMiXQpIZW5uX2RlYXRoc190cmFpbiA8LSBIZW5uX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTI0KSkKSGVubl9kZWF0aHNfdGVzdCA8LSBIZW5uX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTQ0KSkKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X0hlbm5fY2FzZXMgPC0gYXV0by5hcmltYShIZW5uX2Nhc2VzLCBzdGVwd2lzZSA9IEZBTFNFLCBhcHByb3hpbWF0aW9uID0gRkFMU0UpCmZpdF9IZW5uX2Nhc2VzICMgQVJJTUEoMCwgMSwgMSksIEFJQ2MgLSAxNjAzLjI3CmF1dG9wbG90KGZpdF9IZW5uX2Nhc2VzKQpzYXJpbWEuZm9yKEhlbm5fY2FzZXNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMCwgMSwgMSkKbGluZXMoSGVubl9jYXNlc190ZXN0KQpjaGVja3Jlc2lkdWFscyhmaXRfSGVubl9jYXNlcykgIyBwYXNzZXMKZml0X0hlbm5fZGVhdGhzIDwtIGF1dG8uYXJpbWEoSGVubl9kZWF0aHMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X0hlbm5fZGVhdGhzICMgQVJJTUEoMywgMSwgMiksIEFJQ2MgLSA3MjUuMzMKYXV0b3Bsb3QoZml0X0hlbm5fZGVhdGhzKQpzYXJpbWEuZm9yKEhlbm5fZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDMsIDEsIDIpCmxpbmVzKEhlbm5fZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9IZW5uX2RlYXRocykgIyBwLXZhbHVlIHRvbyBsb3csIGRvZXMgbm90IHBhc3MgTGp1bmctQm94IHRlc3QKZml0X0hlbm5fZGVhdGhzMiA8LSBhcmltYShIZW5uX2RlYXRocywgb3JkZXIgPSBjKDYsIDEsIDEpKQpzYXJpbWEuZm9yKEhlbm5fZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDYsIDEsIDEpCmxpbmVzKEhlbm5fZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9IZW5uX2RlYXRoczIpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfSGVubiA8LSBzYXJpbWEuZm9yKEhlbm5fY2FzZXMsIG4uYWhlYWQgPSAxMCwgMCwgMSwgMSkKZmNfMTBfSGVubiRwcmVkCmZjZF8xMF9IZW5uIDwtIHNhcmltYS5mb3IoSGVubl9kZWF0aHMsIG4uYWhlYWQgPSAxMCwgNiwgMSwgMSkgCmZjZF8xMF9IZW5uJHByZWQKCiMgUkVQRUFUIFBST0NFU1MKIyBzdGVwcyB0byBjb21iaW5lIGRhdGEKIyBmaWx0ZXIgY2FzZXMgdG8gc2luZ2xlIGNvdW50eQpNTjA2MTJjIDwtIGNhc2VzMDYxMiAlPiUgZmlsdGVyKFN0YXRlID09ICJNTiIpClN0ZWFybnMwNjEyYyA8LSBNTjA2MTJjICU+JSBmaWx0ZXIoQ291bnR5Lk5hbWUgPT0gIlN0ZWFybnMgQ291bnR5IikKU3RlYXJuczA2MTJjIDwtIFN0ZWFybnMwNjEyY1ssIDU6MTQ4XQpkaW0oU3RlYXJuczA2MTJjKQojIGludmVydCBjb2x1bW5zIGFuZCByb3dzCnggPC0gYXMuZGF0YS5mcmFtZSh0KFN0ZWFybnMwNjEyYykpCmNvbG5hbWVzKHgpIDwtICJWMSIKc3RhcnQgPC0geFsxLCAxXQpzdGFydAojIGFkZCBjb2wgdGhhdCBzaG93cyBkaWZmZXJlbmNlIGJldHdlZW4gdmFsdWVzIChVU0FmYWN0cyBkYXRhIGlzIGN1bXVsYXRpdmUpCngkZGlmZiA8LSBjKHN0YXJ0LCBkaWZmKHgkVjEpKQpjb2xuYW1lcyh4KSA8LSBjKCJDdW0iLCAiQ2FzZXMiKQojIHJlcGVhdCBmb3IgZGVhdGhzCk1OMDYxMmQgPC0gZGVhdGhzMDYxMiAlPiUgZmlsdGVyKFN0YXRlID09ICJNTiIpClN0ZWFybnMwNjEyZCA8LSBNTjA2MTJkICU+JSBmaWx0ZXIoQ291bnR5Lk5hbWUgPT0gIlN0ZWFybnMgQ291bnR5IikKU3RlYXJuczA2MTJkIDwtIFN0ZWFybnMwNjEyZFssIDU6MTQ4XQpkaW0oU3RlYXJuczA2MTJkKQojIGludmVydCBjb2x1bW5zIGFuZCByb3dzCnkgPC0gYXMuZGF0YS5mcmFtZSh0KFN0ZWFybnMwNjEyZCkpCmNvbG5hbWVzKHkpIDwtICJWMSIKc3RhcnQgPC0geVsxLCAxXQpzdGFydAojIGFkZCBjb2wgdGhhdCBzaG93cyBkaWZmZXJlbmNlIGJldHdlZW4gdmFsdWVzIChVU0FmYWN0cyBkYXRhIGlzIGN1bXVsYXRpdmUpCnkkZGlmZiA8LSBjKHN0YXJ0LCBkaWZmKHkkVjEpKQpjb2xuYW1lcyh5KSA8LSBjKCJDdW0iLCAiRGVhdGhzIikKIyBjb21iaW5lIENhc2VzIGFuZCBEZWF0aHMKU3RlYXJuc01OMDYxMiA8LSBjYmluZCh4JENhc2VzLCB5JERlYXRocykKY29sbmFtZXMoU3RlYXJuc01OMDYxMikgPC0gYygiQ2FzZXMiLCAiRGVhdGhzIikKU3RlYXJuc01OdHMgPC0gdHMoU3RlYXJuc01OMDYxMiwgc3RhcnQgPSBjKDIwMjAsIDIyKSwgZnJlcXVlbmN5ID0gMzY1KQphdXRvcGxvdChTdGVhcm5zTU50cywgbWFpbiA9ICJDT1ZJRC0xOSBDYXNlcyBhbmQgRGVhdGhzIC0gTU4sIFN0ZWFybnMgQ291bnR5IikKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KFN0ZWFybnNNTnRzKQpTdGVhcm5zX2Nhc2VzIDwtIFN0ZWFybnNNTnRzWywgIkNhc2VzIl0KU3RlYXJuc19jYXNlc190cmFpbiA8LSBTdGVhcm5zX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjQpKQpTdGVhcm5zX2Nhc2VzX3Rlc3QgPC0gU3RlYXJuc19jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTQ0KSkKU3RlYXJuc19kZWF0aHMgPC0gU3RlYXJuc01OdHNbLCAiRGVhdGhzIl0KU3RlYXJuc19kZWF0aHNfdHJhaW4gPC0gU3RlYXJuc19kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDEyNCkpClN0ZWFybnNfZGVhdGhzX3Rlc3QgPC0gU3RlYXJuc19kZWF0aHMgJT4lIHdpbmRvdyhlbmQgPSBjKDIwMjAsIDE0NCkpCiMgQkVTVCBNT0RFTFMgLSB1c2UgYXV0by5hcmltYSBtb2RlbHMgZm9yIHNpbXBsaWNpdHkgYW5kIGNvbnNpc3RlbmN5CmZpdF9TdGVhcm5zX2Nhc2VzIDwtIGF1dG8uYXJpbWEoU3RlYXJuc19jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfU3RlYXJuc19jYXNlcyAjIEFSSU1BKDQsIDEsIDApLCBBSUNjIC0gMTE5Ny45OAphdXRvcGxvdChmaXRfU3RlYXJuc19jYXNlcykKc2FyaW1hLmZvcihTdGVhcm5zX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDQsIDEsIDApCmxpbmVzKFN0ZWFybnNfY2FzZXNfdGVzdCkKY2hlY2tyZXNpZHVhbHMoZml0X1N0ZWFybnNfY2FzZXMpICMgcC12YWx1ZSB0b28gbG93CmZpdF9TdGVhcm5zX2Nhc2VzMiA8LSBhcmltYShTdGVhcm5zX2Nhc2VzLCBvcmRlciA9IGMoNCwgMSwgMikpCmNoZWNrcmVzaWR1YWxzKGZpdF9TdGVhcm5zX2Nhc2VzMikgIyBwYXNzZXMKZml0X1N0ZWFybnNfZGVhdGhzIDwtIGF1dG8uYXJpbWEoU3RlYXJuc19kZWF0aHMsIHN0ZXB3aXNlID0gRkFMU0UsIGFwcHJveGltYXRpb24gPSBGQUxTRSkKZml0X1N0ZWFybnNfZGVhdGhzICMgQVJJTUEoMCwgMSwgNSksIEFJQ2MgLSA5NC4yOAphdXRvcGxvdChmaXRfU3RlYXJuc19kZWF0aHMpCnNhcmltYS5mb3IoU3RlYXJuc19kZWF0aHNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMCwgMSwgNSkKY2hlY2tyZXNpZHVhbHMoZml0X1N0ZWFybnNfZGVhdGhzKSAjIHAtdmFsdWUgdG9vIGxvdywgZG9lcyBub3QgcGFzcyBManVuZy1Cb3ggdGVzdApmaXRfU3RlYXJuc19kZWF0aHMyIDwtIGFyaW1hKFN0ZWFybnNfZGVhdGhzLCBvcmRlciA9IGMoMCwgMSwgNikpCmNoZWNrcmVzaWR1YWxzKGZpdF9TdGVhcm5zX2RlYXRoczIpICMgcGFzc2VzCiMgVXNlIGJlc3QgbW9kZWxzIHRvIGZvcmVjYXN0IGZ1cnRoZXIgYWhlYWQKZmNfMTBfU3RlYXJucyA8LSBzYXJpbWEuZm9yKFN0ZWFybnNfY2FzZXMsIG4uYWhlYWQgPSAxMCwgNCwgMSwgMikKZmNfMTBfU3RlYXJucyRwcmVkCmZjZF8xMF9TdGVhcm5zIDwtIHNhcmltYS5mb3IoU3RlYXJuc19kZWF0aHMsIG4uYWhlYWQgPSAxMCwgMCwgMSwgNikgCmZjZF8xMF9TdGVhcm5zJHByZWQKCiMgUkVQRUFUIFBST0NFU1MKIyBzdGVwcyB0byBjb21iaW5lIGRhdGEKIyBmaWx0ZXIgY2FzZXMgdG8gc2luZ2xlIGNvdW50eQpNTjA2MTJjIDwtIGNhc2VzMDYxMiAlPiUgZmlsdGVyKFN0YXRlID09ICJNTiIpCkthbmRpeW9oaTA2MTJjIDwtIE1OMDYxMmMgJT4lIGZpbHRlcihDb3VudHkuTmFtZSA9PSAiS2FuZGl5b2hpIENvdW50eSIpCkthbmRpeW9oaTA2MTJjIDwtIEthbmRpeW9oaTA2MTJjWywgNToxNDhdCmRpbShLYW5kaXlvaGkwNjEyYykKIyBpbnZlcnQgY29sdW1ucyBhbmQgcm93cwp4IDwtIGFzLmRhdGEuZnJhbWUodChLYW5kaXlvaGkwNjEyYykpCmNvbG5hbWVzKHgpIDwtICJWMSIKc3RhcnQgPC0geFsxLCAxXQpzdGFydAojIGFkZCBjb2wgdGhhdCBzaG93cyBkaWZmZXJlbmNlIGJldHdlZW4gdmFsdWVzIChVU0FmYWN0cyBkYXRhIGlzIGN1bXVsYXRpdmUpCngkZGlmZiA8LSBjKHN0YXJ0LCBkaWZmKHgkVjEpKQpjb2xuYW1lcyh4KSA8LSBjKCJDdW0iLCAiQ2FzZXMiKQojIHJlcGVhdCBmb3IgZGVhdGhzCk1OMDYxMmQgPC0gZGVhdGhzMDYxMiAlPiUgZmlsdGVyKFN0YXRlID09ICJNTiIpCkthbmRpeW9oaTA2MTJkIDwtIE1OMDYxMmQgJT4lIGZpbHRlcihDb3VudHkuTmFtZSA9PSAiS2FuZGl5b2hpIENvdW50eSIpCkthbmRpeW9oaTA2MTJkIDwtIEthbmRpeW9oaTA2MTJkWywgNToxNDhdCmRpbShLYW5kaXlvaGkwNjEyZCkKIyBpbnZlcnQgY29sdW1ucyBhbmQgcm93cwp5IDwtIGFzLmRhdGEuZnJhbWUodChLYW5kaXlvaGkwNjEyZCkpCmNvbG5hbWVzKHkpIDwtICJWMSIKc3RhcnQgPC0geVsxLCAxXQpzdGFydAojIGFkZCBjb2wgdGhhdCBzaG93cyBkaWZmZXJlbmNlIGJldHdlZW4gdmFsdWVzIChVU0FmYWN0cyBkYXRhIGlzIGN1bXVsYXRpdmUpCnkkZGlmZiA8LSBjKHN0YXJ0LCBkaWZmKHkkVjEpKQpjb2xuYW1lcyh5KSA8LSBjKCJDdW0iLCAiRGVhdGhzIikKIyBjb21iaW5lIENhc2VzIGFuZCBEZWF0aHMKS2FuZGl5b2hpTU4wNjEyIDwtIGNiaW5kKHgkQ2FzZXMsIHkkRGVhdGhzKQpjb2xuYW1lcyhLYW5kaXlvaGlNTjA2MTIpIDwtIGMoIkNhc2VzIiwgIkRlYXRocyIpCkthbmRpeW9oaU1OdHMgPC0gdHMoS2FuZGl5b2hpTU4wNjEyLCBzdGFydCA9IGMoMjAyMCwgMjIpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KEthbmRpeW9oaU1OdHMsIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIE1OLCBLYW5kaXlvaGkgQ291bnR5IikKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KEthbmRpeW9oaU1OdHMpCkthbmRpeW9oaV9jYXNlcyA8LSBLYW5kaXlvaGlNTnRzWywgIkNhc2VzIl0KS2FuZGl5b2hpX2Nhc2VzX3RyYWluIDwtIEthbmRpeW9oaV9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTI0KSkKS2FuZGl5b2hpX2Nhc2VzX3Rlc3QgPC0gS2FuZGl5b2hpX2Nhc2VzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxNDQpKQpLYW5kaXlvaGlfZGVhdGhzIDwtIEthbmRpeW9oaU1OdHNbLCAiRGVhdGhzIl0KS2FuZGl5b2hpX2RlYXRoc190cmFpbiA8LSBLYW5kaXlvaGlfZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxMjQpKQpLYW5kaXlvaGlfZGVhdGhzX3Rlc3QgPC0gS2FuZGl5b2hpX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTQ0KSkKIyBCRVNUIE1PREVMUyAtIHVzZSBhdXRvLmFyaW1hIG1vZGVscyBmb3Igc2ltcGxpY2l0eSBhbmQgY29uc2lzdGVuY3kKZml0X0thbmRpeW9oaV9jYXNlcyA8LSBhdXRvLmFyaW1hKEthbmRpeW9oaV9jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfS2FuZGl5b2hpX2Nhc2VzICMgQVJJTUEoMiwgMSwgMyksIEFJQ2MgLSA5MTQuMDUKYXV0b3Bsb3QoZml0X0thbmRpeW9oaV9jYXNlcykKc2FyaW1hLmZvcihLYW5kaXlvaGlfY2FzZXNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMiwgMSwgMykKbGluZXMoS2FuZGl5b2hpX2Nhc2VzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9LYW5kaXlvaGlfY2FzZXMpICMgcGFzc2VzCmZpdF9LYW5kaXlvaGlfZGVhdGhzIDwtIGF1dG8uYXJpbWEoS2FuZGl5b2hpX2RlYXRocywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfS2FuZGl5b2hpX2RlYXRocyAjIEFSSU1BKDAsIDAsIDApLCBBSUNjIC0gLTMwNC45NyBXaGl0ZSBub2lzZSBtb2RlbAphdXRvcGxvdChmaXRfS2FuZGl5b2hpX2RlYXRocykKc2FyaW1hLmZvcihLYW5kaXlvaGlfZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDAsIDAsIDApCmNoZWNrcmVzaWR1YWxzKGZpdF9LYW5kaXlvaGlfZGVhdGhzKSAjIHBhc3NlcyBManVuZy1Cb3ggdGVzdAojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX0thbmRpeW9oaSA8LSBzYXJpbWEuZm9yKEthbmRpeW9oaV9jYXNlcywgbi5haGVhZCA9IDEwLCAyLCAxLCAzKQpmY18xMF9LYW5kaXlvaGkkcHJlZApmY2RfMTBfS2FuZGl5b2hpIDwtIHNhcmltYS5mb3IoS2FuZGl5b2hpX2RlYXRocywgbi5haGVhZCA9IDEwLCAwLCAwLCAwKSAKZmNkXzEwX0thbmRpeW9oaSRwcmVkCgojIFJFUEVBVCBmb3IgTU4gRGF0YSAoZnVsbCBzdGF0ZSkKTU4wNjEyYyA8LSBjYXNlczA2MTIgJT4lIGZpbHRlcihTdGF0ZSA9PSAiTU4iKQpNTjA2MTJjIDwtIE1OMDYxMmNbLCA1OjE0OF0KZGltKE1OMDYxMmMpCnRvdGFsIDwtIGNvbFN1bXMoTU4wNjEyYykKbGVuZ3RoKHRvdGFsKQp0b3RhbCA8LSBhcy5pbnRlZ2VyKHRvdGFsKQpNTjA2MTJjIDwtIHJiaW5kKE1OMDYxMmMsIHRvdGFsKQpjbGFzcyhNTjA2MTJjKQpNTjA2MTJjIDwtIE1OMDYxMmNbODksIF0KTU4wNjEyYwojIGludmVydCBjb2x1bW5zIGFuZCByb3dzCnggPC0gYXMuZGF0YS5mcmFtZSh0KE1OMDYxMmMpKQpjbGFzcyh4KQpzdHIoeCkKY29sbmFtZXMoeCkgPC0gIlYxIgpzdHIoeCkKc3RhcnQgPC0geFsxLCAxXQpzdGFydAojIGFkZCBjb2wgdGhhdCBzaG93cyBkaWZmZXJlbmNlIGJldHdlZW4gdmFsdWVzIChVU0FmYWN0cyBkYXRhIGlzIGN1bXVsYXRpdmUpCngkZGlmZiA8LSBjKHN0YXJ0LCBkaWZmKHgkVjEpKQpjb2xuYW1lcyh4KSA8LSBjKCJDdW0iLCAiQ2FzZXMiKQp0YWlsKHgpCiMgcmVwZWF0IGZvciBkZWF0aHMgKGZ1bGwgc3RhdGUpCk1OMDYxMmQgPC0gZGVhdGhzMDYxMiAlPiUgZmlsdGVyKFN0YXRlID09ICJNTiIpCk1OMDYxMmQgPC0gTU4wNjEyZFssIDU6MTQ4XQpkaW0oTU4wNjEyZCkKdG90YWwgPC0gY29sU3VtcyhNTjA2MTJkKQpsZW5ndGgodG90YWwpCnRvdGFsIDwtIGFzLmludGVnZXIodG90YWwpCk1OMDYxMmQgPC0gcmJpbmQoTU4wNjEyZCwgdG90YWwpCmNsYXNzKE1OMDYxMmQpCk1OMDYxMmQgPC0gTU4wNjEyZFs4OSwgXQpNTjA2MTJkCiMgaW52ZXJ0IGNvbHVtbnMgYW5kIHJvd3MKeSA8LSBhcy5kYXRhLmZyYW1lKHQoTU4wNjEyZCkpCmNvbG5hbWVzKHkpIDwtICJWMSIKc3RyKHkpCnN0YXJ0IDwtIHlbMSwgMV0Kc3RhcnQKIyBhZGQgY29sIHRoYXQgc2hvd3MgZGlmZmVyZW5jZSBiZXR3ZWVuIHZhbHVlcyAoVVNBZmFjdHMgZGF0YSBpcyBjdW11bGF0aXZlKQp5JGRpZmYgPC0gYyhzdGFydCwgZGlmZih5JFYxKSkKY29sbmFtZXMoeSkgPC0gYygiQ3VtIiwgIkRlYXRocyIpCnRhaWwoeSkKIyBjb21iaW5lIENhc2VzIGFuZCBEZWF0aHMKTU4wNjEyIDwtIGNiaW5kKHgkQ2FzZXMsIHkkRGVhdGhzKQpjb2xuYW1lcyhNTjA2MTIpIDwtIGMoIkNhc2VzIiwgIkRlYXRocyIpCk1OdHMgPC0gdHMoTU4wNjEyLCBzdGFydCA9IGMoMjAyMCwgMjIpLCBmcmVxdWVuY3kgPSAzNjUpCmF1dG9wbG90KE1OdHMsIG1haW4gPSAiQ09WSUQtMTkgQ2FzZXMgYW5kIERlYXRocyAtIE1OIikKIyBDUkVBVEUgVEVTVC9UUkFJTiBTRVRTIEZPUiBDQVNFUyBBTkQgREVBVEhTCmF1dG9wbG90KE1OdHMpCk1OX2Nhc2VzIDwtIE1OdHNbLCAiQ2FzZXMiXQpNTl9jYXNlc190cmFpbiA8LSBNTl9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTI0KSkKTU5fY2FzZXNfdGVzdCA8LSBNTl9jYXNlcyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTQ0KSkKTU5fZGVhdGhzIDwtIE1OdHNbLCAiRGVhdGhzIl0KTU5fZGVhdGhzX3RyYWluIDwtIE1OX2RlYXRocyAlPiUgd2luZG93KGVuZCA9IGMoMjAyMCwgMTI0KSkKTU5fZGVhdGhzX3Rlc3QgPC0gTU5fZGVhdGhzICU+JSB3aW5kb3coZW5kID0gYygyMDIwLCAxNDQpKQojIEJFU1QgTU9ERUxTIC0gdXNlIGF1dG8uYXJpbWEgbW9kZWxzIGZvciBzaW1wbGljaXR5IGFuZCBjb25zaXN0ZW5jeQpmaXRfTU5fY2FzZXMgPC0gYXV0by5hcmltYShNTl9jYXNlcywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfTU5fY2FzZXMgIyBBUklNQSgzLCAxLCAyKSwgQUlDYyAtIDE3MTYuNDgKYXV0b3Bsb3QoZml0X01OX2Nhc2VzKQpzYXJpbWEuZm9yKE1OX2Nhc2VzX3RyYWluLCBuLmFoZWFkID0gMjAsIDMsIDEsIDIpCmxpbmVzKE1OX2Nhc2VzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9NTl9jYXNlcykgIyBwYXNzZXMKZml0X01OX2RlYXRocyA8LSBhdXRvLmFyaW1hKE1OX2RlYXRocywgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFKQpmaXRfTU5fZGVhdGhzICMgQVJJTUEoMywgMSwgMiksIEFJQ2MgLSA4MzYuNzcKYXV0b3Bsb3QoZml0X01OX2RlYXRocykKc2FyaW1hLmZvcihNTl9kZWF0aHNfdHJhaW4sIG4uYWhlYWQgPSAyMCwgMywgMSwgMikKbGluZXMoTU5fZGVhdGhzX3Rlc3QpCmNoZWNrcmVzaWR1YWxzKGZpdF9NTl9kZWF0aHMpICMgZG9lcyBub3QgcGFzcwpmaXRfTU5fZGVhdGhzMiA8LSBhcmltYShNTl9kZWF0aHMsIG9yZGVyID0gYyg0LCAxLCAzKSkKY2hlY2tyZXNpZHVhbHMoZml0X01OX2RlYXRoczIpICMgcGFzc2VzCnNhcmltYS5mb3IoTU5fZGVhdGhzX3RyYWluLCBuLmFoZWFkID0gMjAsIDQsIDEsIDMpCmxpbmVzKE1OX2RlYXRoc190ZXN0KQojIFVzZSBiZXN0IG1vZGVscyB0byBmb3JlY2FzdCBmdXJ0aGVyIGFoZWFkCmZjXzEwX01OIDwtIHNhcmltYS5mb3IoTU5fY2FzZXMsIG4uYWhlYWQgPSAxMCwgMywgMSwgMikKZmNfMTBfTU4kcHJlZApmY2RfMTBfTU4gPC0gc2FyaW1hLmZvcihNTl9kZWF0aHMsIG4uYWhlYWQgPSAxMCwgNCwgMSwgMykgCmZjZF8xMF9NTiRwcmVkCmBgYAoK